2015-12-15 70 views
1

我的应用程序中有这种情况:片段事务和活动转换

一个活动(A)带有多个片段,在某个时间点调用另一个活动(B)。流程如下:F1 => F2 => F3 => B或F1 => F2 => B其中F(n)代表片段。完成活动B后,它返回到F3或F2,但是我的目标是显示用户F1,所以我尝试通过事件总线发送事件,并用F1替换任何其他片段,注意我将每个片段添加到backstack。所以我成功了,但如果我调用片段F2或F3应用程序崩溃有时我得到"IllegalStateException: Can not perform this action after onSaveInstanceState"

所以想办法了很多后,我只是这样做:

public void onClick(View v){ 
//started activity B 
//replaced current fragment with F1 
} 

这样做的最终结果是看到F1活动B之前,一切运行良好,而不crashing.So解决这个故障我更换活动B开始后100 ms的片段。

public void onClick(View v){ 
    //started activity B 
     new Handler().(new Runable(){ 
     @Override 
     public void run() 
     { 
     //replaced current fragment with F1 
     } 
     },100); 
    } 

但我觉得这是丑陋的方式来解决这个问题,我想问你是否有更好的解决方案?

编辑:

我被spcial答案,所以我做类似的事情,与各国的启发。

在活动A我有两个变量。

boolean wasAnotherActivityCalled=false; 
String showFragment=null; 

在我的片段我有这样的:

public void onClick(View v){ 
      //started activity B 
      getActivity().wasAnotherActivityCalled=true; 
      getActivity().showFragment=FragmentOne.class.getSimpleName(); 
      } 

在活动AI有这样的:

@Override 
    protected void onResumeFragments() { 
     super.onResumeFragments(); 
     if(wasAnotherActivityCalled) 
     { 
      if(showFragment.equals(F1.class.getSimpleName())) 
       { //do your logic here} 

      wasAnotherActivityCalled=false; 
      showFragment=null; 
     } 
} 
+0

在呼叫活动b之后......致电完成() –

回答

0

我有事类似于我的应用程序。我所做的就是使用一个简单的“状态机”,其中我有一个表示当前状态(0 = Fragment1,1 = Fragment2 ...等)的int属性和一个我需要的所有fragmentsArrayList。如果我必须切换fragment,我也会增加状态并从ArrayList加载片段。

在我onPause()方法我保存状态sharedPreferences()并在onResume()方法我从sharedPreferences()加载状态,并做了initFragment(state),我只是从fragmentArray[state]片段:-)

这种行为取代fragmentLayout我可以自己处理后援,每次用户更改活动并返回时,都可以返回并保存当前所需片段的状态。此外,我不会将fragments放入backstack中,因为它已经通过我自己处理。

我希望我能帮助你。

+0

我做了类似的事情,谢谢你。查看我的编辑。 –

0

不要添加片段到堆栈中,而commiting它