我的应用程序中有这种情况:
一个活动(A),其中多个片段在某个时刻调用另一个活动(B)。
流程是这样的:F1 => F2 => F3 => B或F1 => F2 => B,其中F(n)代表片段。在我完成活动B后,它返回到F3或F2,但我的目标是显示用户F1,所以我尝试通过事件总线发送事件并用F1替换任何其他片段,请注意我&#39 ; m将每个片段添加到backstack。所以我成功了但是如果我调用片段F2或F3应用程序崩溃,有时我得到"IllegalStateException: Can not perform this action after onSaveInstanceState"
。
因此,在尝试了很多方法后,我只是这样做了:
public void onClick(View v){
//started activity B
//replaced current fragment with F1
}
最终结果是在活动B之前看到F1,其他一切工作正常而没有崩溃。为了解决这个故障,我在活动B开始后100毫秒替换片段。
public void onClick(View v){
//started activity B
new Handler().(new Runable(){
@Override
public void run()
{
//replaced current fragment with F1
}
},100);
}
但是我觉得解决这个问题很难看,我想问你是否有更好的解决方案?
编辑:
我受到了特殊回答的启发,所以我对各州做了类似的事情。
在活动A中,我有两个变量。
boolean wasAnotherActivityCalled=false;
String showFragment=null;
在我的片段中,我有这个:
public void onClick(View v){
//started activity B
getActivity().wasAnotherActivityCalled=true;
getActivity().showFragment=FragmentOne.class.getSimpleName();
}
在活动A中我有这个:
@Override
protected void onResumeFragments() {
super.onResumeFragments();
if(wasAnotherActivityCalled)
{
if(showFragment.equals(F1.class.getSimpleName()))
{ //do your logic here}
wasAnotherActivityCalled=false;
showFragment=null;
}
}
答案 0 :(得分:0)
在提交时不要将你的片段添加到backstack中
答案 1 :(得分:0)
我的应用程序中有类似内容。我做的是使用一个简单的“状态机”,我有一个int
属性,代表当前状态(0 = Fragment1,1 = Fragment2 ......等)和ArrayList
所有我需要fragments
。如果我必须切换fragment
我也会增加状态,只需从ArrayList
加载片段。
在我的onPause()
方法中,我将状态保存在sharedPreferences()
和onResume()
方法中,我从sharedPreferences()
加载状态并执行initFragment(state)
我在只需使用fragmentLayout
中的片段替换fragmentArray[state]
: - )
有了这种行为,我可以自己处理backstack,每次用户更改活动并返回时,可以返回并保存并保存当前所需片段的状态。此外,我不会将fragments
提交到backstack,因为它已经通过我自己处理了。
我希望我可以帮助你。