如何禁用手动滑出导航视图

时间:2016-09-07 15:10:00

标签: android navigation-drawer

我的Activity中有两个导航视图。一个从右边进入,另一个从左边进入。

在从左侧进入的导航视图中,单击项目时会启动不同的片段。而且,这个相同的导航视图具有所有已启动片段共有的菜单项。我对这个没有任何问题。

现在,从右侧进入的导航视图具有菜单项,这些菜单项仅在单击左侧进入导航视图中的第一个项目时启动的特定片段特有。这意味着,当您单击左侧进入导航抽屉中的第一个项目时,将启动一个碎片,右侧进入导航视图中的项目具有与此碎片相关的项目。

因此,当单击工具栏中的菜单项时,会显示右侧导航视图。当其他片段(除上述之外)在视野中时,此菜单项不可见。

我遇到的问题是,即使右侧进入导航视图无法通过其他片段中的菜单项启动,它仍然可以通过滑动屏幕的右边缘来启动。因此,我想完全禁用右侧输入导航视图的滑动功能,因此只能在单击菜单项时启动。

activity_main

 <?xml version="1.0" encoding="utf-8"?>
 <android.support.v4.widget.DrawerLayout
     android:id="@+id/drawer_layout"
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:fitsSystemWindows="true"
     tools:openDrawer="start">

     <include
         layout="@layout/app_bar_main"
         android:layout_width="match_parent"
         android:layout_height="match_parent"/>

     <android.support.design.widget.NavigationView
         android:id="@+id/nav_view"
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
         android:layout_gravity="start"
         android:fitsSystemWindows="false"
         app:headerLayout="@layout/nav_header_main"
         app:menu="@menu/activity_main_drawer"/>

     <android.support.design.widget.NavigationView
         android:id="@+id/cat_nav_view"
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
         android:layout_gravity="end"
         android:fitsSystemWindows="false">

         /** This navigationview enters from the right, I start a fragment with framelayout below.
         The fragment contains a recyclerview **/

         <FrameLayout
             android:id="@+id/transport_cat_container"
             android:layout_width="match_parent"
             android:layout_height="match_parent"/>

     </android.support.design.widget.NavigationView>

 </android.support.v4.widget.DrawerLayout>

MainActivity的片段

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

        ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) {

            @Override
            public void onDrawerClosed(View v){
                super.onDrawerClosed(v);
            }

            @Override
            public void onDrawerOpened(View v) {
                super.onDrawerOpened(v);
            }
        };


        drawer.addDrawerListener(mDrawerToggle);
        mDrawerToggle.syncState();

        navigationView.setNavigationItemSelectedListener(this);
    }


    @Override
        public void onBackPressed() {
            if (drawer.isDrawerOpen(GravityCompat.START)) {
                drawer.closeDrawer(GravityCompat.START);
            } else if (drawer.isDrawerOpen(GravityCompat.END)) {
                drawer.closeDrawer(GravityCompat.END);
            } else {
                super.onBackPressed();
            }

        }


 ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) {

            @Override
            public void onDrawerClosed(View v){
                super.onDrawerClosed(v);
            }

            @Override
            public void onDrawerOpened(View v) {
                super.onDrawerOpened(v);
            }
        };


        drawer.addDrawerListener(mDrawerToggle);
        mDrawerToggle.syncState();

        navigationView.setNavigationItemSelectedListener(this);


Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.

        Fragment fragment;


        if (id == R.id.menu_cars) {
            fragment = new CarsFragment();
            startCarsFrag() //Method to start CarsFragment()
            //The right entering drawer should only be enabled for this fragment
        }


        if (id == R.id.menu_trains) {
            fragment = new TrainsFragment();
            startTrainFrag() //Method to start TrainsFragment
        }

        if (id == R.id.menu_lorries) {
            fragment = new LorriesFragment();
             startLorriesFrag() //Method to start LorriesFragment

        }
        if (drawer != null) {
            drawer.closeDrawer(GravityCompat.START);
        }


        return true;
    }

1 个答案:

答案 0 :(得分:1)

DrawerLayout#setDrawerLockMode()方法是您正在寻找的方法。锁定后,无法拖动打开/关闭抽屉View,但它仍会响应openDrawer()closeDrawer*()方法。

由于您使用了两个抽屉,并且只想锁定一个抽屉,因此您需要使用第二个参数调用该方法以指示要锁定/解锁的抽屉。例如,要锁定辅助抽屉:

drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.END);