导航抽屉 - 禁用单击抽屉后面的项目

时间:2013-07-06 00:36:06

标签: android android-fragments navigation-drawer click-through

有没有办法确保导航抽屉停留在片段中的内容之上?

我用虚拟数据创建了一个小型测试应用程序。 10个片段,带有相应的编号按钮和textview。问题在于片段元素似乎比导航抽屉具有更高的优先级。

enter image description here

如截图所示,一旦我尝试打开“0片段”,它就会选择在导航抽屉后面的按钮上注册点击。按任何其他内容项工作正常,但只要它们下面没有其他可交互项目。如何让导航抽屉正确地保留在其背后的内容之上,我该怎么办?

6 个答案:

答案 0 :(得分:129)

在滑动窗格布局上设置android:clickable="true"标记。

答案 1 :(得分:4)

问题似乎不是因为点击焦点,

访问https://developer.android.com/training/implementing-navigation/nav-drawer.html#DrawerLayout

  

主要内容视图(上面的FrameLayout)必须是DrawerLayout中的第一个子节点,因为XML顺序意味着z排序,抽屉必须位于内容之上。

答案 2 :(得分:3)

在我的片段抽屉中,我将TouchListener设置为返回True。 它对我有用

        mFragmentContainerView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return true;
        }
    });

答案 3 :(得分:2)

我以不同的方式解决了它。

以下是我设置抽屉的代码:

/**
 * Setup Navigation Drawer
 */
private void setDrawer() {
    NavigationDrawerFragment mNavigationDrawerFragment = (NavigationDrawerFragment) getFragmentManager().findFragmentById(R.id.fragment_drawer);
    mNavigationDrawerFragment.setup(R.id.fragment_drawer, (DrawerLayout) findViewById(R.id.drawer), mToolbar);
}

setup方法位于我的NavigationDrawerFragment内,这是我的代码:

/**
 * Users of this fragment must call this method to set up the navigation drawer interactions.
 *
 * @param fragmentId   The android:id of this fragment in its activity's layout.
 * @param drawerLayout The DrawerLayout containing this fragment's UI.
 * @param toolbar      The Toolbar of the activity.
 */
public void setup(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) {
    View mFragmentContainerView = (View) getActivity().findViewById(fragmentId).getParent();
    DrawerLayout mDrawerLayout = drawerLayout;

    //noinspection deprecation
    mDrawerLayout.setStatusBarBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));

    ActionBarDrawerToggle mActionBarDrawerToggle = new ActionBarDrawerToggle(getActivity(), mDrawerLayout, toolbar, "Drawer opened", "Drawer closed") {
        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);
            if (!isAdded()) return;

            // Solution:
            // Disable click event on views below Navigation Drawer
            mFragmentContainerView.setClickable(false);
            getActivity().invalidateOptionsMenu();
        }

        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            if (!isAdded()) return;

            // Solution:
            // Enable click event on views below Navigation Drawer
            mFragmentContainerView.setClickable(true);
            getActivity().invalidateOptionsMenu();
        }
    };

    // Defer code dependent on restoration of previous instance state.
    mDrawerLayout.post(new Runnable() {
        @Override
        public void run() {
            mActionBarDrawerToggle.syncState();
        }
    });

    //noinspection deprecation
    mDrawerLayout.setDrawerListener(mActionBarDrawerToggle);
}

就是这样

答案 4 :(得分:1)

您必须在抽屉布局的最高视图中设置clickablefocusablefocusableInTouchMode

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="true"
    android:focusable="true"
    android:focusableInTouchMode="true">

答案 5 :(得分:-1)

好吧,我找到了解决这个问题的方法。打开抽屉时,您可以通过调用您使用的布局上的bringToFront()方法将导航栏置于前面。这样可确保导航抽屉保持在任何基础内容之上,直到选择了新项目为止。

即:

@Override
public void onDrawerOpened(View drawerView)
   {
   activity.getActionBar().setTitle("Select content");
   activity.invalidateOptionsMenu();
   drawerLayout.bringToFront();
   }