setRetainInstance(true)
何らかの理由でFragmentManager
包含が強制終了されて再構築されたときにフラグメントを保持するようにに指示します。追加または置換するトランザクションの後にインスタンスが存続Activity
することを保証するものではありません。Fragment
アダプタがガベージコレクションされており、新しいアダプタを作成していないようです。
より一般的に簡単な解決策は、ビューレスFragment
にしてを保持することListAdapter
です。これを行う方法は、を作成し、retainインスタンスをtrueに設定して、メソッドFragment
に戻ることです。追加するには、を介して呼び出されます。削除したり交換したりすることは決してないので、アプリの長さの間、常にメモリに残ります。画面の回転はそれを殺しません。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();
}
}