导航抽屉 - 禁止在抽屉后面的项目上点击

59

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

我创建了一个带有虚拟数据的小型测试应用程序。由10个片段组成,每个片段都有相应的编号按钮和文本视图。问题是片段元素似乎比导航抽屉具有更高的优先级。

输入图片描述

如屏幕截图所示,一旦我尝试打开“0片段”,它就会选择在导航抽屉后面的按钮上注册单击事件。按其他内容项可以正常工作,但前提是它们下面没有其他可交互的项。我该怎么做才能使导航抽屉正确地停留在其后面的内容之上?


你尝试过使用 set actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 吗? - Hruskozrout
6个回答

138

在滑动面板布局上设置android:clickable="true"标签。


4
我会尽力为您翻译:我在Fragment中使用LinearLayout作为我的抽屉(drawer),并在LinearLayout中添加了这个属性,它有效了。我将这个信息留在这里,以便人们知道这个属性不仅可以与“滑动面板布局”一起使用,还可以和其他东西一起使用。 - David Velasquez
由于布局现在是可点击的,当您轻触它时会启动涟漪效果。这个能被禁用吗? - Nino van Hooff

4

你这个回答想要告诉我什么?只是主布局中视图的顺序吗?如果是,请用那种方式写。 - rekire

3
在我的抽屉片段中,我设置了TouchListener并返回True。这对我起作用了。
        mFragmentContainerView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return true;
        }
    });

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

就是这样


2

您需要在抽屉布局的最高视图中设置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">

-1

嗯,我找到了一个解决这个问题的方法。当抽屉被打开时,您可以通过在使用的布局上调用bringToFront()方法将导航栏置于前台。这确保了导航抽屉始终位于任何底层内容的顶部,直到选择了新项目。

I.e:

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

android:在抽屉布局上设置“clickable = true”就足够了。 - moondroid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接