底部导航视图中只更改一个图标的大小(Android)

4

我想要在底部导航视图中,仅更改第三个图标的大小。

我希望中心图标变大,就像这样:

My Bottom Nav View

这是我尝试过的方法:

private fun setReportPainIconSize(){
        val bottomNavigationView =
            findViewById<BottomNavigationView>(R.id.navigationBottomView)

    val menuView: BottomNavigationMenuView =
            bottomNavigationView.getChildAt(0) as BottomNavigationMenuView
     
    val iconView: View = menuView.getChildAt(2) **//TO GET REFERENCE OF 3RD ITEM**
                    .findViewById(androidx.core.R.id.icon)
           
    val layoutParams: ViewGroup.LayoutParams = iconView.layoutParams
            val displayMetrics: DisplayMetrics = resources.displayMetrics
            layoutParams.height = TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP, 47F,
                displayMetrics
            ).toInt()
            layoutParams.width = TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP, 44F,
                displayMetrics
            ).toInt()
            iconView.layoutParams = layoutParams
    }

但是当我运行我的应用程序时,它会崩溃并显示以下错误消息:
Caused by: java.lang.NullPointerException: menuView.getChildAt(2)
     …(androidx.core.R.id.icon) must not be null

我该如何实现它?请帮忙!

尝试创建自定义底部导航栏,您可以更改图标大小。 - user12219021
1个回答

2
使用最新的Material Design库(com.google.android.material:material:1.6.1),获取菜单图标View的引用ID为com.google.android.material.R.id.navigation_bar_item_icon_view
因此,您可以像下面的示例一样在程序中更改BottomNavigationView中特定菜单项的大小:
//find the icon view for the menu item index 1
val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottomNavigationView)
val menu = bottomNavigationView.menu
val menuItem = menu.getItem(1)
val navigationBarItemView: NavigationBarItemView = bottomNavigationView.findViewById(menuItem.itemId)
val iconView: View = navigationBarItemView.findViewById(com.google.android.material.R.id.navigation_bar_item_icon_view)

//set the new width and height for the iconView in pixels. You can change also the bottom margin of the icon View.
val iconViewParams: FrameLayout.LayoutParams = iconView.layoutParams as FrameLayout.LayoutParams
iconViewParams.width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 44F, resources.displayMetrics).toInt()
iconViewParams.height = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 47F, resources.displayMetrics).toInt()
iconViewParams.bottomMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 35F, resources.displayMetrics).toInt()
iconView.layoutParams = iconViewParams

如果要在BottomNavigationView上方绘制一些东西,比如中心图标,您需要使用递归函数使BottomNavigationView中的所有ViewGroup父级都具有clipChildren = falseclipToPadding = false。以下是示例代码:

fun recursiveClipChildrenAndClipToPadding(parent: ViewGroup) {

    if(parent is BottomNavigationView){
        val bottomNavigationView = parent as BottomNavigationView
        bottomNavigationView.clipChildren = false
        bottomNavigationView.clipToPadding = false
    }
    for (i in 0 until parent.childCount) {
        val child = parent.getChildAt(i)
        if (child is ViewGroup) {
            val vGroup = child as ViewGroup
            vGroup.clipChildren = false
            vGroup.clipToPadding = false
            recursiveClipChildrenAndClipToPadding(vGroup)
        }
    }
}

你需要这样调用它:

recursiveClipChildrenAndClipToPadding(bottomNavigationView)

我用一些默认图标制作的示例结果如下所示:

自定义菜单项位置


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接