【问题标题】:How to save fragment state while navigating through activity如何在浏览活动时保存片段状态
【发布时间】:2016-04-20 11:01:31
【问题描述】:

可能是问题的标题不清楚。或者我没有描述我在寻找什么。

我的应用中有两个活动。假设他们的名字是 "ActivityA""ActivityB" 。在“ActivityA”下有几个片段。假设他们的名字是 "FragmentA" "FragmentB" "FragmentC" "FragmentD" 等。默认片段是 "FragmentA" ,这意味着当活动开始时 "FragmentA" 开始。

现在,如果我导航到 "ActivityB" 并返回到 "ActivityA" ,它总是打开 "FragmentA" 。但我想要的是,如果我导航到 "FragmentB" ,然后导航到 "ActivityB" ,然后返回到 "ActivityA" 它开始"FragmentA" ,但我希望 "FragmentB" 开始,我之前是在其中

【问题讨论】:

  • 提供一些简短的代码会更好
  • 要从 Activity B 导航到 Activity A,您是使用 Intent 启动 Activity A 还是使用后退按钮?
  • 我正在使用返回按钮
  • 您在哪个活动生命周期添加默认片段?还是通过xml添加的片段?
  • 在onCreate中添加默认片段

标签: android android-fragments android-activity


【解决方案1】:

您可能正在通过startActivity()ActivityB 重新启动ActivityA,而不是完成ActivityB。如果是这样,只需完成您的ActivityB。然后您将位于 ActivityA 中最后显示的片段上。

或者您也可以使用onSaveInstanceState 方法来跟踪您的Fragments。这个answer 可以帮助你。

或者在您的 ActivityA 中使用以下功能也可以解决您的问题:

<activity android:name=".ActivityA" android:launchMode="singleTop">

【讨论】:

    【解决方案2】:

    不确定我是否理解正确,但我认为当你调用 ActivityB 时你需要做的是startActivityForResult。当您按下 BackButton 时,您会提供有关要调用的片段的必要信息,并在 ActivityBonActivityResult 中捕获这些信息,然后导航到所需的片段。

    【讨论】:

      【解决方案3】:

      创建一个返回最后一个可见片段的方法

       public Fragment getVisibleFragment(){
              FragmentManager fragmentManager = MainActivity.this.getSupportFragmentManager();
              List<Fragment> fragments = fragmentManager.getFragments();
              if(fragments != null){
                  for(Fragment fragment : fragments){
                      if(fragment != null && fragment.isVisible())
                          return fragment;
                  }
              }
              return null;
          }
      

      创建Fragment类的实例并将其设置为null

      Fragment lastVisibleFragment = null;
      

      onPause保存最后一个片段

        @Override
          protected void onPause() {
              super.onPause();
               lastVisibleFragment = getVisibleFragment();
          }
      

      然后在onResume() 中添加你所在的最后一个片段(如果不为空)

         @Override
          protected void onResume() {
              super.onResume();
              if(lastVisibleFragment !=null){    
                  getSupportFragmentManager().beginTransaction()
                          .add(yourFrameLayout, lastVisibleFragment)
                          .commit();
              }
             else{ //Add first fragment you were adding}
          }
      

      【讨论】:

      • 我试过你的方法。我的应用程序中有一个导航抽屉。 getVisibleFragment() 返回我的 Navigation DrawerFragment
      猜你喜欢
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多