1

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

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

问候,托马斯

4

1 回答 1

4

setRetainInstance(true)当包含因某种原因被杀死和重建时,将告诉FragmentManager保留片段。Activity它不能保证在Fragment添加或替换事务后实例会继续存在。听起来您的适配器正在被垃圾收集,而您没有创建新的适配器。

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

无论何时ListFragment创建您的,onCreateView()获取FragmentManager并使用该方法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();
   }
}
于 2013-01-17T13:48:14.837 回答