我有一个非常独特的问题,我试图通过当前片段(最后一个可见片段)检索进入主屏幕之前的先前片段
不要再混淆了,这是解决我的问题的步骤
1)通过单击按钮(例如按钮A)从此处打开片段A,启动mainactivity
2)从片段A中,按下另一个按钮,例如B,这将打开片段B。
3)片段B具有关闭并保存按钮,按下该按钮可将我带回到上一个后退片段A(activity.backpressed())
4)现在,我有一个场景,我要通过按按钮B来调用片段B。单击保存并关闭后,如果我立即按home按钮并转到后台并返回到应用程序,它将重新启动该应用程序将全面启动mainactivity,而不是打开片段A(这是所需的片段)。
到目前为止,这是我的代码: 这是我打开片段的通用代码:
public void openFragment(@NonNull Fragment fragment, String tag) {
Fragment f = getSupportFragmentManager().findFragmentByTag(tag);
if (f != null) return;
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(R.anim.slide_up, R.anim.slide_bottom, R.anim.slide_up, R.anim.slide_bottom)
.add(R.id.cl_root_view, fragment, tag)
.addToBackStack(tag)
.commit();
}
在单击按钮B时,我将其称为:
openFragment( FragmentB.newinstance(), fragmentB.TAG);
片段B打开后,我将更新数据,然后单击“保存并关闭”:
@OnClick(R.id.saveAndClose)
void onSaveClick() {
// update the contents
closeFragment();
}
protected void closeFragment() {
Activity activity = getActivity();
hideKeyboard();
if (activity != null) {
activity.onBackPressed();
}
}
您可以看到问题是,数据按预期保存,但是如果我单击“主页”按钮,则在重新打开屏幕/或恢复时,就在保存过程完成并且片段(通过反压)弹出之前,该应用程序重新启动,而不是看到fragmentA(这是基础调用片段)。 (我知道问题正在发生,因为所有这些片段的活动都是相同的,并调用activity.onBackPressed();似乎堆栈中的所有内容都被破坏,并且在恢复应用程序后,似乎它再次调用了活动,而不是后栈中的最后一个片段)。知道如何解决这个问题吗?
我在线上针对类似问题尝试了不同的解决方案,但是没有任何效果,我找不到与我类似的任何问题。另外,在saveedinstancestate和保留实例状态上似乎并没有解决问题。任何想法或建议都会非常有帮助!谢谢!
答案 0 :(得分:1)
我知道了。 这是适合我的解决方案:
fragmentManager = getFragmentManager();
//check if on orientation change.. do not re-add fragments!
if(mSavedInstanceState == null) {
//instantiate the fragment manager
fragmentTransaction = fragmentManager.beginTransaction();
Fragment prevFragment = fragmentManager.findFragmentByTag(FragmentB.TAG);
if (prevFragment != null) {
fragmentTransaction.remove(prevFragment);
}
try {
fragmentManager.popBackStack();
}catch (IllegalStateException e){
e.printStackTrace();
}
fragmentTransaction.commitAllowingStateLoss();
当我的应用程序在后台运行时,我能够成功弹出fragmentB,并因此到达fragmentA,因此当我返回到我的应用程序时,我能够看到具有从fragmentB返回的更新值的fragmentA。