我想在MenuItem
内增加单 NavigationView
的高度。
我正在尝试将Google MapFragment
放入项目的actionLayout
中,如下所示,但我希望地图的高度更大。
有什么想法吗?
activity_main_drawer.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:showIn="navigation_view">
...
<item
android:id="@+id/nav_map"
app:showAsAction="always"
android:title="@string/nav_map"
app:actionLayout="@layout/fragment_map" />
...
</menu>
fragment_map.xml
此处调整android:layout_height
无效。
<?xml version="1.0" encoding="utf-8"?>
<fragment
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:id="@+id/nav_map_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
map:mapType="normal"
map:liteMode="true"/>
Activity.onCreate(...)
MainActivity.kt
在此处设置动作视图的高度无效。
val mapItem = nav.menu.findItem(R.id.nav_map)
// Has no effect: trying to set height to 128dp
mapItem.actionView.layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 128)
// Hack: hide title
mapItem.title = null
val mapView = supportFragmentManager.findFragmentById(R.id.nav_map_fragment) as SupportMapFragment
mapView.getMapAsync { map ->
...
}
答案 0 :(得分:1)
我最终通过创建一个扩展功能来解决此问题,该功能将完成两件事:
MenuItem
(即title = null
)的标题MenuItem
状态更改侦听器的目的是,将项目附加到窗口时,找到操作视图的父级并将其高度设置为WRAP_CONTENT
(并存储原始高度)。分离视图后,它将恢复原始高度。这是因为在滚动时似乎视图实际上是在不同的项目之间回收的……因此,您会发现菜单中的所有项目逐渐受到影响,而不仅仅是目标项目。
扩展功能在下面实现:
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);
我希望这对其他人有帮助。