显示抽屉式导航栏时,清晰地关注内容

问题描述 投票:0回答:2

在具有导航抽屉的 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();
}
android focus navigation-drawer
2个回答
5
投票

事实上,抽屉打开时似乎没有焦点,因此它的

onKeyUp
不会被调用。我在主机活动中检查了这一点,如果活动具有获得焦点的视图(EditText 或其他内容),则在
onBackPressed
DrawerLayout#hasFocus()
中检查此操作将返回 false。

我什至试图搞乱它的

descendantFocusability
属性,但没有成功。我设法用与您类似的方法解决了这个问题:抽屉布局正在请求焦点:

mDrawerLayout.setDrawerListener(new DrawerLayout.SimpleDrawerListener() {
    @Override
    public void onDrawerOpened(View drawerView) {
        mDrawerLayout.requestFocus();
    }
});

您正在清除内容 ViewGroup 的焦点,但我不确定谁获得焦点,很可能没有视图。
老实说,在我看来,这似乎是 DrawerLayout 中的一个错误,就好像它被打开一样,它应该获得焦点。


0
投票

您可以将 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
© www.soinside.com 2019 - 2024. All rights reserved.