正确创建与 dpad 兼容的 UI
Correctly creating a dpad-compatible UI
我想开发一个即使使用方向键也能 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);
}
这就是我使用硬件按钮切换抽屉 opening/closing 的方法:
@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
上。我错过了什么?
显然,这是一个 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);
}
}
我想开发一个即使使用方向键也能 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);
}
这就是我使用硬件按钮切换抽屉 opening/closing 的方法:
@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
上。我错过了什么?
显然,这是一个 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);
}
}