web-dev-qa-db-ja.com

フラグメント内のアクティビティ変数にアクセスする

基本アクティビティBAを拡張するアクティビティAがある場合、アクティビティAからアクティビティBAの任意の変数に安全にアクセスできます。現在使用しているものには、フラグメントFを含むアクティビティAが含まれています。このフラグメントから、上記と同じ方法でAのすべての変数にアクセスします。そうでない場合は、パブリックメソッドを介して利用できるようにする以外に安全な方法があります。

または、基本アクティビティの変数を基本フラグメントにコピーして、すべてのアクティビティとフラグメントで使用できるようにする方法はありますか。

6
Jude Fernandes

公式ドキュメントが示唆しているように、それを実装するための良い方法はインターフェースを使用することです。

FragmentがそのActivityまで通信できるようにするには、Fragmentクラスでインターフェースを定義し、それをActivity内に実装します。

したがって、基本的にフラグメント内で次のようなインターフェイスを定義します。

_public interface MyListener {
     public void onAction();
}
_

MyListener型のフィールドを(まだフラグメント内で)定義します

_MyListener mCallback;
_

次に、onAttach(Activity)メソッドを使用してこのリスナーを設定できます。

_mCallback = (MyListener) activity;
_

これで、フラグメントからアクティビティのメソッドを呼び出すたびに、コールバックを使用できます。

_mCallback.onAction();
_

もちろん、アクティビティはインターフェースを実装する必要があります。そうしないと、アクティビティをMyListenerにキャストするときに例外が発生します。

だから、ただやってください:

_public class MyActivity extends Activity implements MyFragment.MyListener {
    @Override
    public void onAction() {
        // some stuff
    }
}
_

詳細については、フラグメント間の通信について documentation を参照してください。

5
GVillani82

VARIABLE_NAMEがアクティビティACTIVITY_NAMEの変数であり、アクティビティACTIVITY_NAMEの外部からアクセスできる場合

次に、次のコードを使用します。

((ACTIVITY_NAME)this.getActivity()).VARIABLE_NAME //this refers to your fragment
2
Atef Hares