0

アプリがあります。それはフラグメントを使用しています。メイン アクティビティは 2 つのフラグメントから始まります。これらのフラグメントの 1 つには、次のように実行時に 3 番目のフラグメントを追加するために使用されるボタンが含まれています。

button.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Activity activity = getActivity();

            if (fragment3 == null) {
                getFragmentManager()
                .beginTransaction()
                .add(R.id.fragment_content3, new ThirdFragment())
                .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                .commit();
        }

ThirdFragment クラスは次のようになります。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.v(getTag(), "FRAG onCreate CALLED!");
    this.setRetainInstance(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.third_fragment, container, false);
return view;

問題は、アクティビティが再作成されたときにこのフラグメントのビューが削除されないようにする方法を理解できないことです。onCreate() メソッドを @Override して setRetainInstance(true) を使用しようとしましたが、役に立ちませんでした。

だから、私の質問は:

アクティビティが再作成されたときに動的に(実行時に)追加されたフラグメントが削除されないようにするための適切なアプローチは何ですか?

4

1 に答える 1

0

この状況では、アクティビティの状態に関する情報を保存できる追加のコールバック メソッドを実装することで、アクティビティの状態に関する重要な情報を確実に保持できますonSaveInstanceState()

システムはonSaveInstanceState()、アクティビティを破壊に対して脆弱にする前に呼び出します。システムは、putString() や putInt() などのメソッドを使用して、アクティビティに関する状態情報を名前と値のペアとして保存できる Bundle をこのメソッドに渡します。次に、システムがアプリケーション プロセスを強制終了し、ユーザーがアクティビティに戻ると、システムはアクティビティを再作成し、バンドルを と の両方に渡しonCreate()ますonRestoreInstanceState()。これらの方法のいずれかを使用して、保存した状態をバンドルから抽出し、アクティビティの状態を復元できます。復元する状態情報がない場合、渡された Bundle は null です (アクティビティが初めて作成された場合)。Android ドキュメント

解決:

したがって、onSaveInstanceState()フラグメントに関する情報を保持するメソッド内のバンドルのみがあり、フラグメントは複雑なオブジェクトであるため、バンドル内に直接格納することはできません。

私の提案は、@overrideonSaveInstanceState()を使用し、booleanフラグを使用して 3 番目のフラグメントをアタッチする必要があるかどうかを示すことです (可視)。すぐに、 を使用しOnCreate() or onRestoreInstanceState()てバンドルを取得してフラグを読み取ることができ、それに応じて、フラグメントを作成するかどうかを決定できます。

于 2013-04-26T13:27:37.103 に答える