当导航抽屉打开时,Android:onBackPressed()不会被调用

我有一个主要的活动是与两个导航抽屉位于。 左边的那个总是可以访问的,但是正确的是用来显示一些必要的列表并执行某些动作。 当我将某些片段加载到活动的中心FrameLayout中时,他们的操作需要打开右侧抽屉并select一个项目。 所有这些工作都很好,但是我想要确保在按下后退button或者在抽屉closures的情况下单击屏幕时,屏幕被locking,并且装入的碎片被移除。 我还应该提到这个右边的抽屉里有一个FrameLayout ,它依赖于碎片。

在我的主要活动中,这就是我所说的:

 @Override public void onBackPressed(){ Log.d(TAG, "onBackPressed() called"); if(drawerLayoutRight.isDrawerOpen(drawerFrameRight)){ Log.d(TAG, "----------------------"); drawerLayoutRight.closeDrawer(drawerFrameRight); drawerLayoutRight.setDrawerLockMode(1, drawerFrameRight); ExcerciseList fragment = (ExcerciseList) getFragmentManager().findFragmentById(R.id.right_drawer); FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.remove(fragment).commit(); } else { super.onBackPressed(); } } 

我也试过:

 public boolean onKeyDown(int keyCode, KeyEvent event){ if (keyCode == KeyEvent.KEYCODE_BACK) { Log.d(TAG, "onKeyDown called"); return true; } return super.onKeyDown(keyCode, event); } 

但是这也没有奏效。 每当我点击后退button,抽屉会closures,但是这些方法都不会被调用。 但是一旦抽屉closures,如果后退button被按下,这些方法将被调用。 我也想知道是否有人知道一个简单的方法来处理抽屉外的点击。 我想我可以做一个自定义DrawerLayout并覆盖drawerClose()或检查点击触摸事件的坐标。 只是好奇,如果有人有一个更简单的方法。

Solutions Collecting From Web of "当导航抽屉打开时,Android:onBackPressed()不会被调用"

把这一行放到你的代码中:

 mDrawerLayout.setFocusableInTouchMode(false); 

然后当你按下后退button时,它会调用你覆盖的onBackPressed()

在Force EditText中引用自己的问题以在按下时失去焦点

“按照我的经验,当按下后退buttonclosures键盘时,onBackPressed()(至less是默认的@Override中的一个)通常不会触发。据我所知,只有在Backbutton开始完成时才会触发()在当前的活动“。

这可能与导航抽屉相同。

这很可能是因为当抽屉打开时(与SoftKeyboard相同),当前“活动”不在焦点中,所以@Override后退button不被调用。

我能够通过使用DrawerLayout.DrawerListener解决我的问题。 这工作在我的情况,因为当后退button正在按下抽屉仍然closures,即使onBackPressed()方法没有被调用。

@MH说:“如果抽屉被打开,DrawerLayout(我假设你正在使用的)会消耗后退button事件。

尽pipe在文档中我找不到明确的提及, 这里有一些提到的后退button。 不幸的是,这并没有太大的帮助。

@MH所说的解释了为什么打开抽屉时没有调用onBackPressed() ,为什么在closures时调用它。

 drawerLayoutRight.setDrawerListener(this); 

drawerLayoutRight是一个DrawerLayout 。 我的听众看起来像这样:

 @Override public void onDrawerClosed(View arg0) { if(drawerLayoutRight.getDrawerLockMode(drawerFrameRight)!= 1){ drawerLayoutRight.setDrawerLockMode(1, drawerFrameRight); } ExcerciseList fragment = (ExcerciseList) getFragmentManager().findFragmentById(R.id.right_drawer); if (fragment != null) { FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.remove(fragment).commit(); } } 

onDrawerOpened()onDrawerSlide()onDrawerStateChanged()都是空的。 我的抽屉里只有一个人在使用听众,所以我不必检查视图。

只是简单地overrede您的活动或drawerlayout,将做。

 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (KeyEvent.KEYCODE_BACK == keyCode && mDrawerLayout != null && mDrawerLayout.isDrawerOpen(leftDrawerView)) { KeyEventCompat.startTracking(event); return true; } return super.onKeyDown(keyCode, event); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (KeyEvent.KEYCODE_BACK == keyCode && !event.isCanceled() && mDrawerToggle != null && mDrawerLayout.isDrawerOpen(leftDrawerView)) { mDrawerLayout.closeDrawers(); return true; } return super.onKeyUp(keyCode, event); } 

问题,就像@Alex Vasilkov指出的那样,似乎是用drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 方法。

上述build议都没有为我工作。 所以我想写我自己的解决scheme。 我挖掘了DrawerLayout类的源代码,并尝试覆盖onKeyDownonKeyUp方法,但是如果locking模式是LOCK_MODE_LOCKED_CLOSED ,则后退button单击根本不会被触发。 我认为这是一个错误。

所以在我的情况下,我只需要locking左侧的抽屉,而不是正确的。 最后,我调用了drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.START); 此方法locking我的左侧导航抽屉而不是调用drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 这个方法locking了两个抽屉,并导致这个后退button错误。

所以作为总结, drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 以某种方式禁用后退button。 也许只有当你有两个导航抽屉。

添加这行后退button将pipe理closuresDrawerLayout

 mDrawerLayout.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); 

我有一个非常类似的问题, 在一个片段中空列表 (当列表为空时,不会回应button按下),这里提到的一些解决scheme帮助我解决了我的问题。

导致与“onBackPressed()”问题的片段:

 <TextView android:id="@android:id/empty" ... /> <ListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="match_parent" /> 

这个问题是相似的,当适配器返回的列表是空的(@android:id / empty)时,第一个视图(TextView)似乎没有被视为Android的可视焦点/重点视图第二个视图 – ListView – 是)。

所以按下后退button不会被当前显示的视图注册,也不会被我的自定义代码捕获到片段中(直接closures活动)。

在我的情况下,将以下内容添加到onCreateView解决了我的问题(即使列表为空时,也允许后退button被片段捕获):

  View view = inflater.inflate(R.layout.fragment_content, container, false); view.setFocusableInTouchMode(true); view.requestFocus(); 
 DrawerLayout drawer... @Override public void onBackPressed() { // TODO Auto-generated method stub if(drawer.isDrawerOpen(Gravity.LEFT)){ drawer.closeDrawer(Gravity.LEFT); }else{ super.onBackPressed(); } } 

我从这里find了这个答案。 它完美的工作在我的代码。

我知道这有点晚,但仍然…这个答案会帮助别人

 @Override public void onBackPressed() { if (mDrawerLayout.isOpen()) mDrawerLayout.close(); else super.onBackPressed(); }