禁用导航抽屉,切换家庭button/向上指示器的碎片

设置

我有一个活动,其contentView是一个DrawerLayout的实例,它具有一个导航抽屉,在操作栏中显示抽屉指示器。 该活动包含一个Fragment ,我们称它为ListFragment ,其中包含一个选项列表。 当单击一个选项时,我将ListFragmentreplace为DetailFragment

应用程序的体系结构

在这一点上,我想显示一个“向上”的导航选项,而不是导航抽屉指标。 如果通过调用mDrawerToggle.setDrawerIndicatorEnabled(false)禁用抽屉指示器,我可以显示“up”图标,但是这只能删除抽屉图标 – 它不会删除function – 也就是说,当我单击光标,导航抽屉仍然打开。

此外,在这些子视图中,我想通过从屏幕边缘拖动来禁用抽屉的打开。 我已经尝试通过调用setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)但它似乎并没有禁用此function。

我已经尝试了扩展ActionBarDrawerToggle类,以防止在点击指示器时打开抽屉 – 但是,所发生的是重写操作(“上”导航)被执行,但抽屉仍然打开

在使用片段时,我也实现了在Android Navigation Drawer图像和Up插入符之间切换的步骤。 只要显示脱字符号,它就可以工作,但是尽pipe覆盖了向上button的function,菜单仍然会打开(应用程序会导航回来 – 它也会打开抽屉)。

所以,长话短说:当我的布局根目录是一个DrawerLayout时候,是否有任何(最好是清洁和优雅的,但在这一点上,我将与哈克去)的方式来实现这些事情:

  1. 用“上”字符replace抽屉指示器(暂时可通过mDrawerToggle.setDrawerIndicatorEnabled(false))
  2. 当单击插入符时,防止抽屉打开,而是用我自己的“向上”function覆盖
  3. 当我从屏幕边缘拖动时,防止抽屉打开。

编辑

好吧,看起来好像我都重写了ActionBarDrawerToggleonOptionsItemSelected ,当我点击插入符时菜单不会打开。 但是,如果我从边缘拖动它仍然打开。 帮帮我!

短代码

 public void setDrawerState(boolean isEnabled) { if ( isEnabled ) { mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); drawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_UNLOCKED); drawerToggle.setDrawerIndicatorEnabled(true); drawerToggle.syncState(); } else { mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); drawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); drawerToggle.setDrawerIndicatorEnabled(false); drawerToggle.syncState(); } } 

这只是我到达的解决scheme的一部分,但要弄清楚这个错误是相当困难的,所以我将这个留在这里,以便为了后代的缘故。

这是我如何定义我的导航抽屉的ListView:

 <ListView android:id="@+id/listview_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start|bottom" android:background="#111" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" /> 

即使在调用setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED) ,仍然可以将抽屉滑动。

但是,将layout_gravity更改为"start"此问题似乎已解决。

我能够在一个导航抽屉的应用程序样本中重现此问题,所以它似乎是一个可重现的问题,并不是我的情况所特有的。

build立在sonida的答案。 在调用setDrawerIndicatorEnabled(false)之后,onNavigateUp还没有被调用。 所以,我刚刚创build了一个名为它的新的onClickListener:

 public void setDrawerState(boolean isEnabled) { if ( isEnabled ) { mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); drawerToggle.setDrawerIndicatorEnabled(true); drawerToggle.syncState(); } else { mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); drawerToggle.setDrawerIndicatorEnabled(false); drawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onSupportNavigateUp(); } }); drawerToggle.syncState(); } } 

我也想

 drawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_UNLOCKED); 

已经贬值了,但没有它就可以正常工作。

您需要禁用滑动并禁用操作栏主页button:

使用下面的代码,build立在已经给出的代码禁用滑动

  public void setDrawerState(boolean isEnabled) { if ( isEnabled ) { mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); mDrawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_UNLOCKED); mDrawerToggle.setDrawerIndicatorEnabled(true); mDrawerToggle.syncState(); getActivity().getActionBar().setHomeButtonEnabled(true); } else { mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); mDrawerToggle.onDrawerStateChanged(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); mDrawerToggle.setDrawerIndicatorEnabled(false); mDrawerToggle.syncState(); getActivity().getActionBar().setHomeButtonEnabled(false); } } 

build立在@sonida的回答之后使用@ luca992和@jai给出的调整。

我尝试了以上提示的代码但是在操作栏左侧的“上”或“后退”箭头只是没有显示在我的应用程序。 幸运的是我能够解决这个问题。

我不得不在setNavigationDrawerState()中添加额外的这段代码[参考: android.support.v7.app.ActionBarDrawerToggle.setHomeAsUpIndicator ]

toggle.setHomeAsUpIndicator(R.drawable.ic_keyboard_backspace_white_24dp);

我从Material.io下载了绘图:ic_keyboard_backspace_white_24dp

这里是完整的代码:

MainActivity.java – > onCreate()

 DrawerLayout drawer; ActionBarDrawerToggle toggle; @Override protected void onCreate(Bundle savedInstanceState) { // Start: Code automatically generated by Android Studio super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); drawer = (DrawerLayout) findViewById(R.id.drawer_layout); toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.setDrawerListener(toggle); toggle.syncState(); // End: Code automatically generated by Android Studio // I had to add this listener as the "back" arrow was totally unresponsive // Thanks to @luca992 toggle.setToolbarNavigationClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onBackPressed(); } }); // Start: Code automatically generated by Android Studio NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); // End: Code automatically generated by Android Studio // More custom code for other stuff // ... } 

MainActivity.java – > setNavigationDrawerState()

 public void setNavigationDrawerState(boolean isEnabled) { if ( isEnabled ) { drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED); toggle.setDrawerIndicatorEnabled(true); toggle.syncState(); } else { drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); toggle.setDrawerIndicatorEnabled(false); // the extra line of code goes here toggle.setHomeAsUpIndicator(R.drawable.ic_keyboard_backspace_white_24dp); toggle.syncState(); } 

MainActivity.java – > onBackPressed()

 @Override public void onBackPressed() { DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else if(getSupportFragmentManager().getBackStackEntryCount() > 0){ getSupportFragmentManager().popBackStack(); }else { super.onBackPressed(); } } 

MainActivity.java – > startFragment()[例如虚函数]

 public void startFragment(){ MyFrag myFrag = new MyFrag(); getSupportFragmentManager() .beginTransaction() .replace(R.id.frag_container ,myFrag) .addToBackStack(null) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) .commit(); } 

MyFrag.java – > onViewCreated()

 @Override public void onViewCreated (View view, Bundle savedInstanceState){ super.onViewCreated(view, savedInstanceState); // Say, using an implemented interface Make call to MainActivitiy's setNavigationDrawerState() passing false // setNavigationDrawerState(false) // ... } 

MyFrag.java – > onDestroyView()

 @Override public void onDestroyView(){ // Say, using an implemented interface Make call to MainActivitiy's setNavigationDrawerState() passing true // setNavigationDrawerState(true) super.onDestroyView(); }