片段交易和活动转换

时间:2015-12-15 07:14:45

标签: android android-fragments android-lifecycle

我的应用程序中有这种情况:

一个活动(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;
         }
 }

2 个答案:

答案 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,因为它已经通过我自己处理了。

我希望我可以帮助你。