Я решил эту проблему, создав функцию расширения, которая будет выполнять две вещи:
- Удалить заголовок
MenuItem
(то есть title = null
) - ПрисоединитьСлушатель изменения состояния для
MenuItem
Слушатель изменения состояния имеет целью, когда элемент прикрепляется к окну, найти родителя вида действия и установить его высоту * 1012.* (и сохранение исходной высоты).Когда вид отсоединен, он восстанавливает первоначальную высоту.Это связано с тем, что при прокрутке кажется, что представления фактически перераспределяются между различными элементами, поэтому в противном случае вы обнаружите, что постепенно затрагиваются все элементы меню, а не только целевой элемент.
Функция расширения реализована ниже:
fun MenuItem.fillActionView() {
// Hide the title text
title = null
// Fill the action view
val thisView = actionView
thisView.addOnAttachStateChangeListener(object: View.OnAttachStateChangeListener {
private var originalHeight: Int? = null
override fun onViewAttachedToWindow(view: View?) {
if (view === thisView) {
val v = view?.parent?.parent as? View
if (v != null) {
v.layoutParams = v.layoutParams
.apply {
originalHeight = height
height = ViewGroup.LayoutParams.WRAP_CONTENT
}
}
}
}
override fun onViewDetachedFromWindow(view: View?) {
val h = originalHeight
val v = view?.parent?.parent as? View
if ((h != null) && (v != null)) {
v.layoutParams = v.layoutParams
.apply {
height = h
originalHeight = null
}
}
}
})
}
Вы можете использовать ее в onCreate()
своей деятельности, например:
val mapItem = nav.menu.findItem(R.id.nav_map) // Find your menu item which has the action view set
mapItem.fillActionView()
Java-код:
View.OnAttachStateChangeListener menuItemActionViewStateListener = new View.OnAttachStateChangeListener() {
int originalHeight = 0;
@Override
public void onViewAttachedToWindow(View v) {
View parent = (View) v.getParent();
if (parent != null)
parent = (View)parent.getParent();
if (parent != null) {
ViewGroup.LayoutParams p = parent.getLayoutParams();
originalHeight = p.height;
p.height = ViewGroup.LayoutParams.WRAP_CONTENT;
parent.requestLayout();
}
}
@Override
public void onViewDetachedFromWindow(View v) {
if (originalHeight != 0) {
View parent = (View) v.getParent();
if (parent != null)
parent = (View)parent.getParent();
if (parent != null) {
ViewGroup.LayoutParams p = parent.getLayoutParams();
p.height = originalHeight;
}
}
}
};
И просто используйте это как здесь:
final View v = inflater.inflate(R.layout.main_menu_item, null);
v.addOnAttachStateChangeListener(menuItemActionViewStateListener);
menuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
menuItem.setActionView(v);
menuItem.setIcon(null);
menuItem.setTitle(null);
Я надеюсь, что это полезно для других.