【问题标题】:How to disable manual sliding-out of navigation view如何禁用手动滑出导航视图
【发布时间】:2016-09-07 15:10:00
【问题描述】:

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

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

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

因此,当单击工具栏中的菜单项时,右导航视图会被盯着。当其他片段(除了前面提到的)在视图中时,这个菜单项是不可见的。

我遇到的问题是,即使右侧进入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 片段

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

【问题讨论】:

  • 我不确定你是否打算从Fragments 自己做这件事,但无论如何,this post 应该会有所帮助。 DrawerLayout#setDrawerLockMode() 方法是您正在寻找的。在您的情况下,您可以使用第二个参数调用它来指定要锁定/解锁的抽屉;例如,drawer.setDrawerLockMode(lockMode, GravityCompat.END)。忽略ActionBarDrawerToggle 的东西,因为它不适用于第二个抽屉。
  • @MikeM。请问您可以输入您的评论作为答案吗?我将它与第二个参数一起使用并修复了它。

标签: android navigation-drawer


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多