从片段返回活动

时间:2018-10-31 12:58:54

标签: android

在整个测试中,我注意到Fragment没有onBackPressed,与Activity中的一样。

我的问题是:我有一个Activity,它接了一个Fragment,在那个Fragment中,我在工具栏上有一个后退按钮(该按钮工作正常,回来时没有出现任何错误),并且具有设备。

基本上,流程如下所示:MainActivity-MessagesActivity-ConversationsFragment-Conversa活动。

我需要在ConversationsFragment屏幕和MessagesActivity屏幕之间进行管理。

如何像在设备的后退按钮onBackPressed中那样进行管理?

3 个答案:

答案 0 :(得分:0)

您可以在kotlin中使用以下代码:

    view.isFocusableInTouchMode = true
    view.requestFocus()
    // TODO DETECT BACK PRESSED IN FRAGMENT
    view.setOnKeyListener(View.OnKeyListener { _, keyCode, event ->
        if (keyCode == KeyEvent.KEYCODE_BACK && event!!.action == KeyEvent.ACTION_UP) {
            //sendResultBack()
            closeActivity()
            return@OnKeyListener true
        }
        false
    })

在Java中:

view.setFocusableInTouchMode(true);
view.requestFocus();
view.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            Log.i(tag, "keyCode: " + keyCode);
            if( keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
                Log.i(tag, "onKey Back listener is working!!!");
                getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
                return true;
            } 
            return false;
        }
    });

答案 1 :(得分:0)

在加载片段时,请添加一个布尔值loaded = true;

然后

@Override
public void onBackPressed() {
  if (loaded) {
    // remove the fragment
    loaded = false;
  }
  else {
    // start the previous activity
  }
}

答案 2 :(得分:0)

我通常为此使用基类的接口。因此,创建一个

BaseFragment

每个片段都需要扩展。在BaseFragment内添加:

    /////////////////////////////////////////////////////////////////
// CHILD METHODS
/////////////////////////////////////////////////////////////////
/**
 * To handle backpress down in fragments
 * Called from Parent Activity through BaseFragment Reference and regular onBackPressed

 * @return true if handled down here to avoid letting parent handle it
 */
open fun onBackPressed(): Boolean {
    //override if you care about it in fragment
    return false
}

现在您的Fragment中只要重写onBackPress并返回true(如果您对其进行处理),否则super.onBackpressed()将为您返回false。

示例 HomeFragment

 override fun onBackPressed(): Boolean{
        //if connect dialog is open and didn't handle the on back pressed then call parent onbackpressed
        if(mConnectDialog == null){
            return mConnectDialog!!.onBackPressed()
        }else{
            return super.onBackPressed()
        }
    }

在该示例中,可能会有一个对话框打开,我想在活动自行关闭之前按回关闭该对话框。

接下来在“活动”中,您必须像这样处理它:

override fun onBackPressed() {
    if(mSelectedFragment != null){
        if(!mSelectedFragment!!.onBackPressed()){
            super.onBackPressed()
        }
    }else{
        super.onBackPressed()
    }
}

因此您可以看到Activity onBackPress检查是否首先需要处理一个片段。如果片段返回False(未处理),则转到下一个调用者。在这种情况下,它是超级产品,但您可以根据需要对其进行自定义。

这是在Kotlin中完成的,但是如果需要,您也可以粘贴并转换为Java。