【问题标题】:Fragment transactions and activity transitions片段事务和活动转换
【发布时间】:2015-12-15 07:14:45
【问题描述】:

我的应用中有这样的场景:

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

这样做的最终结果是在活动 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;
         }
 }

【问题讨论】:

  • 在调用activity b之后......调用finish()

标签: android android-fragments android-lifecycle


【解决方案1】:

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

在我的onPause() 方法中,我将状态保存在sharedPreferences() 中,在onResume() 方法中,我从sharedPreferences() 加载状态并执行initFragment(state),我只需将fragmentLayout 替换为来自的片段fragmentArray[state] :-)

通过这种行为,我可以自己处理 backstack,每次用户更改活动并返回时,可以返回并保存当前所需片段的状态。此外,我不会将fragments 提交到后台堆栈,因为它已经通过我自己处理。

希望我能帮到你。

【讨论】:

    【解决方案2】:

    提交时不要将你的片段添加到后台堆栈中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      相关资源
      最近更新 更多