Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 替代NavigationView中单个菜单项的高度_Android_Android Layout_Navigationview_Android Navigationview - Fatal编程技术网

Android 替代NavigationView中单个菜单项的高度

Android 替代NavigationView中单个菜单项的高度,android,android-layout,navigationview,android-navigationview,Android,Android Layout,Navigationview,Android Navigationview,我想增加导航视图中单个菜单项的高度 我试图将GoogleMapFragment放在项目的内部,如下所示,但我希望地图的高度更大 有什么想法吗 注: 我想使用NavigationView的标准菜单布局(我不希望在使用时实现整个自定义菜单布局) 我不想更改所有项目的高度,例如,仅更改地图项目 activity\u main\u drawer.xml 在Activity.onCreate(…)InMainActivity.kt 在“动作”视图上设置高度在此处无效 val mapItem = na

我想增加
导航视图中单个
菜单项的高度

我试图将Google
MapFragment
放在项目的内部,如下所示,但我希望地图的高度更大

有什么想法吗

注:
  • 我想使用NavigationView的标准菜单布局(我不希望在使用时实现整个自定义菜单布局)
  • 我不想更改所有项目的高度,例如,仅更改地图项目

activity\u main\u drawer.xml
Activity.onCreate(…)
In
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 ->
    ...
}

我最终通过创建一个扩展函数来解决这个问题,该函数将完成两件事:

  • 删除
    菜单项的标题(即
    title=null
  • 将状态更改侦听器附加到
    MenuItem
  • 状态更改侦听器的目的是,当项目附加到窗口时,查找动作视图的父视图,并将其高度设置为
    WRAP\u 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);
    

    我希望这对其他人有帮助。

    您找到解决方案了吗谢谢,您的修复也帮了我的忙。我将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);