web-dev-qa-db-ja.com

オブジェクトをフラグメントに渡す

私は最近多くのFragmentsで作業しており、オブジェクトをFragmentsに渡す2つの異なる方法を使用していますが、私が見ることができる唯一の違いは、以下のFragmentOneが取ったアプローチでは、渡すには、Serializableインターフェイスを実装する必要があります( およびそれに関連するすべて )。

どちらか一方を使用する利点はありますか?

public class FragmentOne extends Fragment {
    public static final String FRAGMENT_BUNDLE_KEY = 
        "com.example.FragmentOne.FRAGMENT_BUNDLE_KEY";

    public static FragmentOne newInstance(SomeObject someObject) {
        FragmentOne f = new FragmentOne();
        Bundle args = new Bundle();
        args.putSerializable(FRAGMENT_BUNDLE_KEY, someObject);
        f.setArguments(args);
        return f;
    }

    public SomeObject getSomeObject() {
        return (SomeObject) getArguments().getSerializable(FRAGMENT_BUNDLE_KEY);
    }
}

そして

public class FragmentTwo extends Fragment {
    SomeObject mSomeObject;  

    public static FragmentTwo newInstance(SomeObject someObject) {
        FragmentTwo fragment = new FragmentTwo();
        fragment.setSomeObject(someObject);
        return fragment;
    }

    public void setSomeObject(SomeObject someObject) {
        mSomeObject = someObject;
    }
}
40
Martyn

オブジェクトをフラグメントに渡すには3つの方法があります

彼らです:

  1. オブジェクトをセッターに渡すのが最も速い方法ですが、状態は自動的に復元されません。
  2. setArgumentsオブジェクトを使用するSerializableは最も遅い方法ですが(小さなオブジェクトでも大丈夫だと思います)、自動的に状態を復元します。
  3. Parcelableとして渡すことは高速な方法で(渡す要素のコレクションがある場合は2番目の方法よりも優先します)、自動状態復元があります。

http://developer.Android.com/reference/Android/os/Parcelable.html

55
logcat

listなどのコレクションの場合:

私の経験を共有したかった。

parcelableを実装する必要があります

PutParcelableArrayListメソッドを使用するだけです。

ArrayList<LClass> localities = new ArrayList<LClass>;
...
Bundle bundle = new Bundle();
bundle.putParcelableArrayList(KEY_LClass_LIST, localities);
fragmentInstance.setArguments(bundle);

return fragmentInstance;

そしてそれを使用して取得...

localities = savedInstanceState.getParcelableArrayList(KEY_LCLass_LIST);

そのため、他の何らかの理由でカスタムArrayListが必要な場合を除き、余分な作業を行わずに、LocalityクラスにのみParcelableを実装できます。

1