【问题标题】:Navigation drawer - Disable click through on items behind the drawer导航抽屉 - 禁用点击抽屉后面的项目
【发布时间】:2013-07-04 02:57:26
【问题描述】:

有什么方法可以确保导航抽屉位于片段内容的顶部?

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

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

【问题讨论】:

  • 你试过设置 actionbar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); ?

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


【解决方案1】:

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

【讨论】:

  • 我在 Fragment 中使用 LinearLayout 作为我的抽屉,我将此属性添加到 LinearLayout 并且它起作用了。把它留在这里,这样人们就知道它适用于“滑动窗格布局”以外的其他东西
  • 由于布局现在是可点击的,当您点击它时会启动涟漪效果。可以禁用吗?
【解决方案2】:

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

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

主内容视图(上面的 FrameLayout)必须是 DrawerLayout 中的第一个子视图,因为 XML 顺序意味着 z 顺序,并且抽屉必须位于内容的顶部。

【讨论】:

  • 你到底想用这个答案告诉我什么?只是主布局中视图的顺序?如果是这样,请也这样写。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    这是我设置抽屉的代码:

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

    就是这样

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        即:

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

        【讨论】:

        • android:clickable="true" 在抽屉布局上就够了
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        • 2015-09-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多