正确创建与 dpad 兼容的 UI

Vek*_*r88 4 android android-support-library androiddesignsupport android-navigationview

我想开发一个即使使用 dpad 也能 100% 运行的应用程序,但不适用于电视设备,所以我不想依赖 Leanback 库。我已经遵循了这里的指南,以便集中我的 UI 的正确元素。

\n\n

我正在使用支持设计库,但我的设计遇到了一些问题NavigationView

\n\n
    \n
  • 当我第一次打开抽屉时,它检查了第一个项目,但聚焦了另一个项目
  • \n
  • 如果我关闭并再次打开抽屉,则不会检查任何项目并且焦点会丢失
  • \n
\n\n

这就是我正在做的处理焦点的事情:

\n\n
private void initDrawer(){\n    drawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);\n    navigationView = (NavigationView)findViewById(R.id.navigation_view);\n    navigationView.setNavigationItemSelectedListener(this);\n    drawerToggle = new ActionBarDrawerToggle(MainActivity.this, drawerLayout, R.string.app_name, R.string.app_name){\n        @Override\n        public void onDrawerOpened(View drawerView) {\n            super.onDrawerOpened(drawerView);\n            //This is not working properly\n            navigationView.requestFocus();\n        }\n\n        @Override\n        public void onDrawerClosed(View drawerView) {\n            super.onDrawerClosed(drawerView);\n            //This seems to work\n            mContentLayout.requestFocus();\n        }\n    };\n    drawerLayout.setDrawerListener(drawerToggle);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这就是我正在做的使用硬件按钮切换抽屉打开/关闭的操作:

\n\n
@Override\npublic boolean onKeyUp(int keyCode, KeyEvent event){\n    if(keyCode==KeyEvent.KEYCODE_BUTTON_Y){\n        drawerToggle.syncState();\n        if(drawerLayout.isDrawerOpen(GravityCompat.START)){\n            drawerLayout.closeDrawer(GravityCompat.START);\n        }\n        else {\n            drawerLayout.openDrawer(GravityCompat.START);\n        }\n        return true;\n    }\n    else return super.onKeyUp(keyCode, event);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

NavigationView每次打开抽屉时,我想将第一个项目聚焦在 \xc2\xa0 上。我缺少什么?

\n

Vek*_*r88 5

显然,这是设计支持库的一个已知错误

Google 声称已在 23.1.1 中修复该问题,但它不起作用。

我必须在我的onDrawerOpened方法中进行这些更改:

@Override
public void onDrawerOpened(View drawerView) {
    super.onDrawerOpened(drawerView);
    if(navigationView.requestFocus()){
        NavigationMenuView navigationMenuView = (NavigationMenuView)navigationView.getFocusedChild();
        navigationMenuView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
    }
}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

508 次

最近记录:

9 年,11 月 前