06_Android Fragmentと宿主Activity間の値伝達

2902 ワード

1.ActivityからFragmentへの転送


1.1 set/getArguments()メソッド


Activity間でIntent.set/getExtral()の方法で値を伝達/受信するように,ホストActivityでは
 ...
 Bundle bundle = new Bundle();
 bundle.putString("key", "value");
 fragment.setArguments(bundle);

Fragmentで
String value = getArguments().getString("key");
...

1.2 newInstance()メソッド


この方法は前の方法で別の形式を変換しただけだ.
Fragmentでは、newInstance()インスタンスを定義します.
public static MyFragment newInstance(String value) {
        Bundle bundle = new Bundle();
        bundle.putString("key", value);
        MyFragment fragment = new MyFragment();
        fragment.setArguments(bundle);
        return fragment;
    }

ホストActivityでは、FragmentをnewInstance()メソッドで作成し、value値を渡します.
MyFragment fragment = MyFragment.newInstance("0");
...

Fragmentでは、最初の方法と同じように伝達された値を取得します.
String value = getArguments().getString("key");
...

Activityは、スクリーンの回転やメモリの不足など、destroyが発生し、再createが発生する場合があります.これに対してActivityに依存して存在するFragmentでも同様の状況が発生する.Fragmentは、いったん再createを作成すると、デフォルトの非パラメトリックコンストラクション関数を呼び出し、初期化作業のためにパラメトリックコンストラクション関数を実行できなくなります.だからこの方法には瑕疵がある.

1.3開示された値取得方法の暴露


ホストActivityで、渡すパラメータを公開された戻り値を定義する方法
    private int value;
    ...
    public int getValue() {
        return value;
    }
    ...

FragmentのonAttach()メソッドでは,公開メソッドを呼び出して値を取得する.
 @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        //   Activity
        int value = ((MainActivity)context).getValue();
    }

しかし、この方法により、Fragmentは宿主Activityにバインドされ、Fragmentは他のActivityに多重化できず、Fragment設計の初心に反している.

2.Fragmentは宿主Activityに値を伝達する


2.1インタフェースコールバックの方法


Fragmentでインタフェースを定義する
    public interface MyCallBack {
        void callback(String content);
    }

FragmentのonAttach()メソッドでこのインタフェースをインスタンス化

private MyCallBack myCallBack;
...
@Override
    public void onAttach(Context context) {
        super.onAttach(context);
        myCallBack = (MyCallBack)context; //  
    }

Fragmentで値を渡す必要がある場所でインタフェースを参照する方法
 @Override
    public void onClick(View view) {
        myCallBack.callback(textView.getText().toString());
    }

ホストActivityでこのインタフェースを実装し,インタフェースコールバックを実装する
    //  
    @Override
    public void callback(String content) {
        Toast.makeText(this,content, Toast.LENGTH_SHORT).show();
    }

もう一つ注意しなければならないのはFragmentで
    //  activity  
    @Override
    public void onDetach() {
        super.onDetach();
        myCallBack = null;
    }