当前位置: 首页 > 知识库问答 >
问题:

一个活动、多个片段和setRetainInstance

秦伯寅
2023-03-14

在我的应用程序中,我使用了一个活动和两个片段。该应用程序使用带有容器的布局,因此片段是通过事务添加的。第一个片段包含列表视图,另一个片段包含列表视图项的详细视图。两个片段都使用setRetainInstance(true)。片段是通过替换事务添加的,并设置了addToBackStack(null)。列表片段包含一个实例变量,其中包含列表的一些信息。现在我正在切换到详细并按回,实例变量为null。我阅读了setRetainInstance和addToBackStack并删除了addToBackStack,但即使这样,实例变量也是null。

有人知道我可能做错了什么吗?

你好,托马斯

共有1个答案

韦高谊
2023-03-14

setRetainInstance(true)将告诉碎片管理器(FragmentManager)在包含的活动因某种原因被终止和重建时保留碎片。它不能保证在要添加或替换的事务之后,片段实例将仍然存在。听起来您的适配器正在被垃圾收集,而您并没有创建新的适配器。

一个更简单的解决方案是制作一个无视图的片段来保留你的ListAdapter。这样做的方法是创建片段,将retain实例设置为true,并在方法onCreateView()中返回null。要添加它,只需通过碎片事务(FragmentTransaction)调用addFragment(Fragment,String)。你永远不会删除或替换它,因此它将在应用程序的整个过程中始终保留在内存中。屏幕旋转不会杀死它。

每当创建ListFragment时,在创建视图()中获取碎片管理器,并使用方法findFragmentById()或FindFragmentByTag()从内存中检索保留的碎片。然后从该片段中获取适配器,并将其设置为列表的适配器。

public class ViewlessFragment extends Fragment {

   public final static string TAG = "ViewlessFragment";

   private ListAdapter mAdapter;

   @Override
   public ViewlessFragment() {
      mAdapter = createAdater();
      setRetainInstance(true);
   }

   @Override
   public void onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      return null;
   }

   public ListAdapter getAdapter() {
      return mAdapter;
   }
}

public class MyListFragment extends ListFragment {

   final public static String TAG = "MyListFragment";

   @Override
   public void onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      final View returnView = getMyView();
      final ViewlessFragment adapterFragment = (ViewlessFragment) getFragmentManager().findFragmentByTag(ViewlessFragment.TAG);
      setListAdapter(ViewlessFragment.getAdapter());
      return returnView;
   }
}

public class MainActivity extends FragmentActivity {

   @Override
   public void onCreate(Bundle icicle) {
      // ... setup code...
      final FragmentManager fm = getSupportFragmentManager();
      final FragmentTransaction ft = fm.beginTransaction();
      ViewlessFragment adapterFragment = fm.findFragmentByTag(ViewlessFragment.TAG);
      if(adapterFragment == null) {
         ft.add(new ViewlessFragment(), ViewlessFragment.TAG);
      }
      ft.add(R.id.fragmentContainer, new MyListFragment(), MyListFragment.TAG);
      ft.commit();
   }
}

 类似资料:
  • 我读过很多关于这方面的文章,但也有2012年或更早的文章。 (我只是打算从数据库中读取和插入一些数据。)

  • 我有一个疑问,想澄清一些关于包含多个片段的活动的观点。 我有10个片段与一个活动(HomeActivity.java)相连;此活动包含一个导航抽屉和工具栏,带有多个图标,如搜索、添加、删除、后退按钮等。 我遵循的结构如下:, 用户点击抽屉菜单中的任何项目,我正在加载片段, 碎片加载- 我正在根据HomeActivity本身中的片段更改标题名称,基于工具栏。 我的导航抽屉项目只有一个片段,在frag

  • 好吧,正如我试图在标题中总结的那样,下面是细节。 我们有一个相对较大的应用程序,它使用Dagger,以非常不理想的方式,所以我们决定开始编写测试,为此,我需要公开Mockito的依赖项,因此,我面临一个问题,开始使用单例工厂提供视图模型,仍然适用,并且有大量的教程可以解释这一点。 在我们的应用程序中,有许多使用单个活动实现的功能和导航组件,该单个活动有时具有创建的视图模型,我们使用该模型在容器活动

  • 我已经完成了导航,现在进入第一个片段。在第一个片段中有两个按钮,我需要通过按下这些按钮来切换到一个新的活动。我不明白如何正确地实施它。我犯了一个错误。 代码,eror

  • 我想在Android的一个活动中添加两个片段。但在加法时,它给出了错误; activity_main.xml 片段的布局1 片段2的布局

  • 问题内容: 我在小组活动中有一个片段,我想用另一个片段替换它: 在不使用活动组的情况下作为单独的项目完成时,它工作正常,当控件进入getview()时,每件事在日志猫中都可以正常工作,但是没有视图可见,甚至没有任何异常出现,我希望将书详细信息片段由部分详细信息片段代替。 图书详细信息片段的XML具有id book_description_fragment,而部分描述片段的xml具有id secti