1

データの保存インスタンスと復元について多くのことを読みましたが、私の場合は実装できません。アプリケーションでの私のケースは何ですか。

  1. 私はアクティビティ(MainActivity)を使用しており、その中でフラグメントを呼び出しています
  2. ParentFragment はその中で ChildFragment を呼び出しますが、ParentFragment には TextViews などの独自のビューがあり、First name、Last name、および age を取得し、この部分の下でプログラムで ChildFragment を呼び出しています

このようにして、MainActivity に 2 つのフラグメントがあり、画面上で一度にユーザーに表示されます。

**欲しいもの**

  1. ユーザーが方向を変更したときにレイアウトも変更する必要がありますが、テキストフィールドがそこにデータを保持する必要もあります。
  2. 画面の向きが変更された後に新しいレイアウトが設定された後に、いくつかのフラグメント変数とそのデータを構成の変更時にも保存し、それらを取得したいと考えています。

**問題と混乱**

  1. Fragment.setRetainInstance(true) を設定した場合、フラグメントは引き続き onConfiguration Change コールバックを受け取ることができますか?

  2. デバイスを回転すると、フラグメントが再初期化され、アクティビティに Asynctask があり、それが再び実行されます。アクティビティに同じデータを保持させたいです。どうすればそれを達成できますか?

私を助けて、ヒントを教えてください。

4

1 に答える 1

0
  1. 向きの変更時にレイアウトを変更する場合は、アクティビティを保持する (マニフェストで定義された対応するアクティビティの android:configChanges="orientation" 値を設定する) か、フラグメントで setRetainInstance() を使用して、構成の変更を処理しないでください。
  2. 構成変更時にフラグメント状態を保存するため
    @Override protected void onSaveInstanceState(Bundle outState) { outState.putInt(FIRST_NAME_VALUE_KEY, firstNameTextView.getText()); outState.putInt(LAST_NAME_VALUE_KEY, lastNameTextView.getText()); super.onSaveInstanceState(outState); }
    、およびフラグメント使用時に状態をビューに書き戻すため
    @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.my_fragment, container, false); if (savedInstanceState != null) { String firstName = savedInstanceState.getInt(FIRST_NAME_VALUE_KEY); String lastName = savedInstanceState.getInt(LAST_NAME_VALUE_KEY); firstNameTextView.setText(firstName); lastNameTextView.setText(lastName); } return view; }

  3. アクティビティを保持することで onConfigurationChanged() コールバックを受け取ります。 Fragment.setRetainInstance(true) とは関係ありません。

  4. asynctask の再実行を避けるために、データを保存し、アクティビティ内で次のコールバックを使用して保持できます。
    @Override protected void onSaveInstanceState(Bundle savedInstanceState) { // Save custom values into the bundle savedInstanceState.putInt(SOME_VALUE, someIntValue); savedInstanceState.putString(SOME_OTHER_VALUE, someStringValue); // Always call the superclass so it can save the view hierarchy state super.onSaveInstanceState(savedInstanceState); }

      onCreate(Bundle savedInstanceState) コールバックでは、savedInstanceSate を確認できます。これに基づいて、u asynctask を呼び出したり、以下のように値を保持したりできます。
    @Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
 if (savedInstanceState == null) { asyncTask.execute(); } else { someIntValue = savedInstanceState.getInt(SOME_VALUE); someStringValue = savedInstanceState.getString(SOME_OTHER_VALUE); } }

于 2016-08-23T09:47:01.143 に答える