1

私のアプリでは、1つのアクティビティと2つのフラグメントを使用しています。アプリはコンテナ付きのレイアウトを使用するため、フラグメントはトランザクションを介して追加されます。最初のフラグメントにはリストビューが含まれ、他のフラグメントにはリストビューアイテムの詳細ビューが含まれます。両方のフラグメントはsetRetainInstance(true)を使用します。フラグメントは置換トランザクションを介して追加され、addToBackStack(null)が設定されます。listfragmentには、リストのいくつかの情報を保持するインスタンス変数が含まれています。今、私は詳細に変更して押し返し、インスタンス変数はnullです。setRetainInstanceとaddToBackStackについて読み、addToBackStackを削除しましたが、それでもインスタンス変数はnullです。

誰かが私が間違っているかもしれないことを知っていますか?

よろしく、トーマス

4

1 に答える 1

4

setRetainInstance(true)何らかの理由でFragmentManager包含が強制終了されて再構築されたときにフラグメントを保持するようにに指示します。追加または置換するトランザクションの後にインスタンスが存続Activityすることを保証するものではありません。Fragmentアダプタがガベージコレクションされており、新しいアダプタを作成していないようです。

より一般的に簡単な解決策は、ビューレスFragmentにしてを保持することListAdapterです。これを行う方法は、を作成し、retainインスタンスをtrueに設定して、メソッドFragmentに戻ることです。追加するには、を介して呼び出されます。削除したり交換したりすることは決してないので、アプリの長さの間、常にメモリに残ります。画面の回転はそれを殺しません。nullonCreateView()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 に答える