在具有导航抽屉的 Android 活动中清除焦点的最佳方法是什么?
问题在于,当用户选择了文本框时,如果您打开导航抽屉,后退事件不会被抽屉消耗,并且导航会后退一步,使抽屉保持打开状态。
现在我解决了在活动中使用这个问题,但我想知道是否有人使用另一种解决方案,我不需要使用 ActionBarDrawerToggle 事件。
/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View drawerView) {
View window = findViewById(R.id.content_frame);
window.clearFocus();
}
事实上,抽屉打开时似乎没有焦点,因此它的
onKeyUp
不会被调用。我在主机活动中检查了这一点,如果活动具有获得焦点的视图(EditText 或其他内容),则在 onBackPressed
DrawerLayout#hasFocus()
中检查此操作将返回 false。
我什至试图搞乱它的
descendantFocusability
属性,但没有成功。我设法用与您类似的方法解决了这个问题:抽屉布局正在请求焦点:
mDrawerLayout.setDrawerListener(new DrawerLayout.SimpleDrawerListener() {
@Override
public void onDrawerOpened(View drawerView) {
mDrawerLayout.requestFocus();
}
});
您正在清除内容 ViewGroup 的焦点,但我不确定谁获得焦点,很可能没有视图。
老实说,在我看来,这似乎是 DrawerLayout 中的一个错误,就好像它被打开一样,它应该获得焦点。
您可以将 checkable="false" 添加到所有您不想获得焦点的项目
示例->
<item
android:icon="@drawable/ic_search"
android:id="@+id/nav_search_apps"
android:checkable="false"
android:title="Search Apps"/>
我们也可以通过编程来完成此操作
navView.menu.findItem(R.id.nav_search_apps).isCheckable = false