Android:导航抽屉打开时未调用onBackPressed()

Rya*_*ith 22 android

我有一个主要活动,有两个导航抽屉.左边的一个始终可访问,但右边的一个用于显示一些必要的列表并执行某些操作.当我将某些片段加载到FrameLayout活动的中心时,他们会执行需要打开右抽屉并选择项目的操作.所有这一切都很有效,但是我想确保当按下后退按钮或者在抽屉外面点击屏幕时抽屉被关闭,锁定并且在那里装载的碎片被移除.我还应该提一下,这个正确的抽屉有一个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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

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

    return super.onKeyDown(keyCode, event);
}
Run Code Online (Sandbox Code Playgroud)

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

Neo*_*eoh 72

将此行放入您的代码中:

mDrawerLayout.setFocusableInTouchMode(false);
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢,问题似乎是方法`mDrawerLayout.setDrawerLockMode(...)`,在解决onBackPressed问题后添加`mDrawerLayout.setFocusableInTouchMode(false)`. (8认同)

Sha*_*ade 2

引用我自己在Force EditText to Lost focus when backPressed 的问题

“根据我的经验,onBackPressed()(至少是活动中默认的@Override)在按下后退按钮关闭键盘时通常不会触发。据我所知,它只会在按后退按钮启动结束时触发() 当前活动。”

这可能同样适用于抽屉式导航栏。

这很可能是由于当抽屉打开时当前“活动”不处于焦点(与软键盘相同),因此不会调用@Override后退按钮。