在整个测试中,我注意到Fragment没有onBackPressed,与Activity中的一样。
我的问题是:我有一个Activity,它接了一个Fragment,在那个Fragment中,我在工具栏上有一个后退按钮(该按钮工作正常,回来时没有出现任何错误),并且具有设备。
基本上,流程如下所示:MainActivity-MessagesActivity-ConversationsFragment-Conversa活动。
我需要在ConversationsFragment屏幕和MessagesActivity屏幕之间进行管理。
如何像在设备的后退按钮onBackPressed中那样进行管理?
答案 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。