lio*_*ibe 1 android navigation-drawer android-navigation android-navigationview
我在这里写的是关于我们从 AppCompat 库迁移到 AndroidX 库时引入的一个问题。在此过程中,当以下问题开始时,我们从 切换android.support.design.widget.NavigationView
到 and that\xe2\x80\x99s。com.google.android.material.navigation.NavigationView
在我们的NavigationView设计中,为了节省空间,我们实现了一个可展开的菜单,这样当用户点击\xe2\x80\x9cmore\xe2\x80\x9d按钮时,菜单就会展开以显示更多选项。一开始只有一些选项可见,其余选项不可见,如下所示;
\n\n单击 \xe2\x80\x9cMore...\xe2\x80\x9d 按钮后,菜单将扩展为;
\n\n为此,我们使用以下代码;
\n\n@Override\npublic boolean onNavigationItemSelected(MenuItem item)\n{\n ....\n if (item.getItemId() == R.id.nav_more)\n {\n item.setVisible(false); // hide the \xe2\x80\x9cMore\xe2\x80\x9d item\n getMenu().findItem(R.id.nav_option_3).setVisible(true);\n getMenu().findItem(R.id.nav_option_4).setVisible(true);\n getMenu().findItem(R.id.nav_option_5).setVisible(true);\n getMenu().findItem(R.id.nav_option_6).setVisible(true);\n return true;\n }\n .......\n return false;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n好吧,这段代码在过去是有效的,但是当我们迁移到使用 androidx 库时,噗,它停止工作了。嗯,确实起到了一点作用。\xe2\x80\x9c更多...\xe2\x80\x9d 按钮被隐藏,但之前隐藏的选项没有显示。\n因为,我花了很多小时才解决这个问题,并避免其他人头痛,我会解释一下问题和解决方案。
\n\n在这种情况下要做的第一件事就是查看源代码。由于代码是开源的,我可以在 github 上获取它。乍一看我并没有变得更聪明。我发现NavigationView有一个NavigationMenuPresenter对象字段(称为),它有一个名为updateMenuView()presenter
的方法 ,该方法调用adapter.update(),后者调用prepareMenuItems()和。这听起来像是需要修复,因此使用反射,我们访问并调用了该方法,但令人惊讶的是,它没有帮助!notifyDataSetChanged()
updateMenuView()
所以,我决定把它发挥到极致,看看如果我打电话会发生什么getMenu().clear()
,不管你信不信,什么也没有发生。似乎显示后对菜单所做的任何更改都会被NavigationView
忽略。但快速浏览一下源代码,我看不出任何原因。
那么我该如何解决这个问题呢?我尝试使用该库的最新 alpha 版本,但仍然遇到同样的问题。
\n\n好吧,经过大量工作,我找到了解决方案。其实很简单。请耐心等待答案。
\n\n狮子抄写员
\n所以我回到源代码,寻找一些线索,当我发现一个名为setUpdateSuspished(boolean updateSuspished)的方法时。嗯,这听起来很可疑!我搜索了这个方法的用法,发现它是在onClick回调中调用的。这是代码的最小化版本;
\n\n@Override\n public void onClick(View view) {\n NavigationMenuItemView itemView = (NavigationMenuItemView) view;\n setUpdateSuspended(true);\n MenuItemImpl item = itemView.getItemData();\n boolean result = menu.performItemAction(item, NavigationMenuPresenter.this, 0);\n setUpdateSuspended(false);\n }\n
Run Code Online (Sandbox Code Playgroud)\n\n答对了!似乎在处理点击时,NavigationView
暂停并且不会识别对菜单所做的任何更改。我不确定其原因,但当我们在回调中更新菜单onNavigationItemSelected
(由该方法调用)时onClick
,菜单更新将被忽略。
好吧,一旦我理解了这个问题,解决方案就简单明了。我只是将代码包装在 a 中Runnable
,并将其发布,以便它在方法返回后运行,并onClick
设置setUpdateSuspended
回 false。这是更新后的代码;
@Override\npublic boolean onNavigationItemSelected(MenuItem item)\n{\n ....\n if (item.getItemId() == R.id.nav_more)\n {\n final MenuItem itemFinal = item;\n post(new Runnable()\n {\n @Override\n public void run()\n {\n getMenu().findItem(R.id.nav_option_3).setVisible(true);\n getMenu().findItem(R.id.nav_option_4).setVisible(true);\n getMenu().findItem(R.id.nav_option_5).setVisible(true);\n getMenu().findItem(R.id.nav_option_6).setVisible(true);\n itemFinal.setVisible(false); // hide the \xe2\x80\x9cMore\xe2\x80\x9d item\n }\n });\n return true;\n }\n .......\n return false;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n中提琴!可扩展菜单现在像以前一样工作,隐藏的项目现在显示出来了!
\n\n我希望这对遇到同样问题的其他人有所帮助。
\n\n狮子抄写员
\n 归档时间: |
|
查看次数: |
446 次 |
最近记录: |