【发布时间】: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。请问您可以输入您的评论作为答案吗?我将它与第二个参数一起使用并修复了它。