35

「newInstance」パターン (新しい Android フラグメントをインスタンス化するためのベスト プラクティス) について知っています。しかし、たとえば別のフラグメントがデータを変更した場合、フラグメントのこれらの引数を更新するにはどうすればよいでしょうか?

フラグメント/アクティビティ間のコールバック メソッドについては知っていますが、これらのコールバックは引数を更新しませんか?!

例: フラグメントの作成時に、URI をバンドルと共に it に渡します。次に、別のフラグメントが最初のフラグメントの changeUri(Uri uri) メソッド コールバックを介してこの URI を変更します。その後、フラグメントが再作成された場合 (たとえば、画面の回転が原因で)、後で更新された uri の代わりに、引数バンドルから最初の URI が使用されます。正しいですか?

これを解決するためのベストプラクティスは何ですか? 手動でそれをsavedInstanceStateに保存し、使用時にinstanceStateまたはarguments-bundleのどちらを使用するかを決定する必要がありますか?

フラグメントの引数を処理する標準的な方法を探しているので、そのようなアプローチ (疑似コード) を使用していると思います。

private Uri arg1;

public static Fragment newInstance(Uri arg1) {
  create bundle
  create fragment instance
  set bundle to fragment
  return fragment
}

private void onCreate(Bundle savedInstance) {
  if(savedInstance != null) {
    arg1 = savedInstance.uri
  }
}

private Uri getUri() {
  if(arg1 == null) {
    arg1 = getArguments.uri
  }
  if(arg1 == null) {
    arg1 = defaultValue
  }
}

したがって、私の議論にアクセスするための単純に統一された方法があります。そして、その引数が必要になるたびに、if-else-hassle を使用する必要はありません。

あなたはそれについてどう思いますか?

4

6 に答える 6

6

バンドルの値を変更するだけです。

例:

synchronized (fragment.getArguments()) {
    fragment.getArguments().putInt(KEY, new Value);
}

そして、新しい引数でコンテンツを更新します

于 2015-02-28T08:05:03.393 に答える
1

フラグメントの引数を更新するためのベスト プラクティス: メソッドを介して引数を追加する必要があるnewInstance()のはなぜですか? また、それがフラグメントのベスト プラクティスである理由は何ですか?

フラグメントは、アクティビティのモジュール セクションと考えることができます。これは、フラグメントを作成するときに、モジュール化して独立させる必要があることを意味します。

Fragment操作に引数が必要な が必要だとします。このように書くことができます:

MyFragmentClass mFrag = new MyFragmentClass();
Bundle bundle = new Bundle();
bundle.putString("key", value);
mFrag.setArguments(bundle);

また、正常に動作し、onCreateメソッドで引数を取得できます。違いは次のとおりです。引数なしで Fragment のインスタンスを作成して に追加することもできますが、FragmentManagerフラグメントを操作するには引数が必要です。Fragment にメソッドを追加するnewInstanceと、開発者は Fragment をインスタンス化するときに引数を追加する必要があります。だからこそベストプラクティスと言われています。

あなたの問題ではsetRetainInstance(boolean retain)、親アクティビティが破棄されたときにフラグメントが破棄されるのを防ぐために使用できます。

于 2014-10-03T04:09:06.737 に答える
0

フラグメントの使用方法に応じて、その戦略の効果が決まる場合があります。

たとえば、共通のタブ/ビュー ページャー パターンに多数のフラグメントがあり、それらを FragmentStatePagerAdapter で管理している場合、アクティビティまたは他のフラグメントが、存在しなくなったフラグメント インスタンスを参照して null ポインター例外が発生する可能性があります。

コールバックを書きたくない場合、これを回避する方法は、Intents と BroadcastReceivers を使用することです (これは少しやり過ぎで管理が難しいかもしれませんが、正しく行うと、私の経験では頭痛の種を大幅に節約できます)。親アクティビティとの間でブロードキャストを送受信します。

インテントの優れた点は、特定の時間に機能するように調整でき、バンドルやパーセル可能なオブジェクトを含む幅広いデータ エクストラを受け入れることができることです。

于 2014-10-02T20:00:02.800 に答える
0

フラグメントを再利用したいが引数を更新する必要がある場合は、fragment.getArguments().putAll(bundle);を使用する必要があります。

    private static void setInspireByDoArguments(DoOptionsFragment fragment, long doId) {
    Bundle bundle = new Bundle();
    bundle.putLong(Constants.EXTRA_DO_ID, doId);
    bundle.putInt(Constants.EXTRA_DO_OPTIONS_DIALOG_MODE, MODE_GET_INSPIRE_BY_DO);
    if (fragment.getArguments() != null) {
        fragment.getArguments().putAll(bundle);
    } else
        fragment.setArguments(bundle);
}

 //This is how I managed to Check if the fragment exist and update the arguments.

 public static void showDoInspireDialog(FragmentManager fragmentManager, long doId, DoOptionsFragment.DoOptionCallBack callBack) {
    DoOptionsFragment doOptionsFragment = (DoOptionsFragment) fragmentManager.findFragmentByTag("do_options_fragment");
    if (doOptionsFragment == null) {
        doOptionsFragment = DoOptionsFragment.getInspiredByDoInstance(doId, callBack);
        fragmentManager.beginTransaction()
                .add(doOptionsFragment, "do_options_fragment")
                .commit();
    } else {
        doOptionsFragment.setCallBack(callBack);
        setInspireByDoArguments(doOptionsFragment, doId);
        doOptionsFragment.showInspireByDoDialog(doId);
    }
}

  public static DoOptionsFragment getInspiredByDoInstance(long doId, DoOptionsFragment.DoOptionCallBack callBack) {
    DoOptionsFragment doOptionsFragment = new DoOptionsFragment();
    setInspireByDoArguments(doOptionsFragment, doId);
    doOptionsFragment.setCallBack(callBack);
    return doOptionsFragment;
}
于 2016-10-12T12:59:20.513 に答える