正确创建兼容dpad的UI

时间:2016-01-07 13:43:29

标签: android android-support-library androiddesignsupport android-navigationview

我想开发一个即使使用dpad也可以100%正常运行的应用程序,但不能用于电视设备,因此我不想依赖Leanback库。我已经遵循了指南here,以便专注于我的UI的正确元素。

我正在使用支持设计库,我的NavigationView

有几个问题
  • 当我第一次打开抽屉时,它会检查第一个项目,但另一个项目是
  • 如果我再次关闭并打开抽屉,则没有选中项目且焦点丢失

这就是我正在做的工作:

private void initDrawer(){
    drawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout);
    navigationView = (NavigationView)findViewById(R.id.navigation_view);
    navigationView.setNavigationItemSelectedListener(this);
    drawerToggle = new ActionBarDrawerToggle(MainActivity.this, drawerLayout, R.string.app_name, R.string.app_name){
        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            //This is not working properly
            navigationView.requestFocus();
        }

        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);
            //This seems to work
            mContentLayout.requestFocus();
        }
    };
    drawerLayout.setDrawerListener(drawerToggle);
}

我正在使用硬件按钮切换抽屉打开/关闭:

@Override
public boolean onKeyUp(int keyCode, KeyEvent event){
    if(keyCode==KeyEvent.KEYCODE_BUTTON_Y){
        drawerToggle.syncState();
        if(drawerLayout.isDrawerOpen(GravityCompat.START)){
            drawerLayout.closeDrawer(GravityCompat.START);
        }
        else {
            drawerLayout.openDrawer(GravityCompat.START);
        }
        return true;
    }
    else return super.onKeyUp(keyCode, event);
}

每次打开抽屉时,我都想把第一项放在NavigationView上。我错过了什么?

1 个答案:

答案 0 :(得分:3)

这显然是known bug设计支持库。

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);
    }
}