android - 如何禁用导航 View 的手动滑出

标签 android navigation-drawer

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

在从左边进入的navigtionview中,点击item时会启动不同的fragment。而且,这个相同的导航 View 有所有启动的 fragment 共有的菜单项。我对这个没有任何问题。

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

因此,当单击工具栏中的菜单项时,右侧的导航 View 会被注视。当其他 fragment (除了上述 fragment )在 View 中时,此菜单项不可见。

我遇到的问题是,即使右进入navigationview无法通过其他fragment中的menuitem启动,也可以通过滑动屏幕右边缘启动。所以我想完全禁用这个右进入navigationview的滑动特性,所以它只能在点击菜单项时启动。

代码

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 的 fragment

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

最佳答案

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

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

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

关于android - 如何禁用导航 View 的手动滑出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39373534/

相关文章:

java - 安卓 4 : Give buttons another style/appearance

android - 让抽屉导航滑到工具栏/操作栏下方

android - 抽屉导航 google maps v2 , map 屏蔽抽屉

android - IntentService 中的 NetworkOnMainThreadException

java - 将获取的用户名放在抽屉导航 Activity 的导航 header 中

android - <include> FrameLayout 和 App/Action Bar 碰撞

android - 使用通知计数指示器制作 "badge"自定义 View

ListActivity中标题栏中的Android自定义字体

android - 如何处理来自 ContentProvider 的异常?

android - Google Maps Directions API 限制