menu.add报错
来源:3-8 BottomNavigationView 实现底部导航能力-大功告成

TOM_QI
2024-08-18
AppBottomBar这个类,每次执行到menu.add就报错,代码我从老师仓库里复制过去的
tabs.forEachIndexed { index, tab ->
Log.e("ning","forEachIndexed:${index},tab.route=${tab.route},tab.title=${tab.title},tab.enable=${tab.enable},tab.size=${tab.size},tab.index=${tab.index}")
if (!tab.enable) return@forEachIndexed
val menuItem = menu.add(0, tab.route.hashCode(), index, tab.title)
menuItem.setIcon(sIcons[index])
}
日志里堆栈信息
2024-08-18 15:29:25.733 10053-10053 ning com.example.jetpack E forEachIndexed:0,tab.route=home_fragment,tab.title=首页,tab.enable=true,tab.size=24,tab.index=0
...
Caused by: android.view.InflateException: Binary XML file line #26 in com.example.jetpack:layout/activity_main: Binary XML file line #26 in com.example.jetpack:layout/activity_main: Error inflating class com.example.jetpack.navigation.AppBottomBar
Caused by: android.view.InflateException: Binary XML file line #26 in com.example.jetpack:layout/activity_main: Error inflating class com.example.jetpack.navigation.AppBottomBar
...
at com.example.jetpack.MainActivity.onCreate(MainActivity.kt:18)
...
Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=6
2024-08-18 14:52:11.866 9414-9414 AndroidRuntime com.example.jetpack
E at android.content.res.AssetManager.getPooledStringForCookie(AssetManager.java:867)
at android.content.res.AssetManager.getResourceValue(AssetManager.java:562)
at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:222)
at android.content.res.Resources.loadXmlResourceParser(Resources.java:2504)
at android.content.res.Resources.getLayout(Resources.java:1261)
at android.view.LayoutInflater.inflate(LayoutInflater.java:536)
at com.google.android.material.navigation.NavigationBarItemView.<init>(NavigationBarItemView.java:135)
at com.google.android.material.bottomnavigation.BottomNavigationItemView.<init>(BottomNavigationItemView.java:34)
at com.google.android.material.bottomnavigation.BottomNavigationMenuView.createNavigationBarItemView(BottomNavigationMenuView.java:196)
at com.google.android.material.navigation.NavigationBarMenuView.getNewItem(NavigationBarMenuView.java:789)
at com.google.android.material.navigation.NavigationBarMenuView.buildMenuView(NavigationBarMenuView.java:705)
at com.google.android.material.navigation.NavigationBarPresenter.updateMenuView(NavigationBarPresenter.java:72)
at androidx.appcompat.view.menu.MenuBuilder.dispatchPresenterUpdate(MenuBuilder.java:292)
at androidx.appcompat.view.menu.MenuBuilder.onItemsChanged(MenuBuilder.java:1065)
at androidx.appcompat.view.menu.MenuBuilder.startDispatchingItemsChanged(MenuBuilder.java:1092)
at com.google.android.material.navigation.NavigationBarMenu.addInternal(NavigationBarMenu.java:81)
at androidx.appcompat.view.menu.MenuBuilder.add(MenuBuilder.java:478)
at com.example.jetpack.navigation.AppBottomBar.<init>(AppBottomBar.kt:50)
... 30 more
MainActivity.kt 18行就是 setContentView(R.layout.activity_main)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
NavGraphBuilder.build(navController,this)
/*val appBottomBar = findViewById<AppBottomBar>(R.id.app_bottom_bar)
appBottomBar.setOnItemSelectedListener {
navController.navigate(it.itemId)
!TextUtils.isEmpty(it.title)
}*/
}
我debug看下来,老师的代码在执行到getPooledStringForCookie时会返回"res/layout/abc_screen_simple.xml",我自己建的项目debug到这里(getPooledStringForCookie)就会抛ArrayIndexOutOfBoundsException异常
依赖版本什么的我都看了,没看到和老师有差别的地方,这章之前的代码也都ok的,但是只要activity_main.xml加上AppBottomBar就有问题
<com.example.jetpack.navigation.AppBottomBar
android:id="@+id/app_bottom_bar"
android:layout_width="match_parent"
android:layout_height="48dp"
android:clipChildren="false"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent" />
希望老师帮我找找看原因
写回答
1回答
-
TOM_QI
提问者
2024-08-18
找到问题了,原来是我在执行AppConfig.getBottomBarConfig方法的时候把context.assets给关了
try { assets.use { ast -> BufferedReader(InputStreamReader(ast.open(fileName))).use { br -> var line :String? = null; while (br.readLine().also { line = it } != null){ sb.append(line) } } } }catch (e:IOException){ e.printStackTrace() }
找了快一天了,前面试了下静态的方式做没有问题,然后就试着用静态的方式初始化之后进行menu.add操作,发现没问题,然后我就再把AppBottomBar里的代码复制过来执行下,发现 AppConfig.getBottomBarConfig之后再执行add都不行,对比了下老师的AppConfig原来就是这个close的锅,总算找到问题了 T T
00
相似问题