24

私のアプリには、fragmentAFragmentBという 2 つのフラグメントがあります。FragmetAのボタンをクリックすると、fragmentBでリストが開かれます。fragmentBのリストからアイテムを選択すると、結果がfragmentAに渡されます。すべてのフラグメントに対して TabActivity を 1 つだけ使用しています。fragmentBでリスト項目が選択されると、fragmentBをスタックからポップアウトして、 fragmentAに直接戻ることができます

結果を前のフラグメントに渡す方法を知っている人はいますか?

ありがとう。

4

4 に答える 4

17

アップデート

アクティビティは親コントローラーであり、フラグメント/ビュー自体の範囲外に関係するフラグメント/ビューによって発生したイベントを処理する責任を負う必要があります。

フラグメントは、それがホストするビューのサブコントローラーとして機能します。独自のビュー間のすべてのイベントと通信、フラグメントはそれ自体を処理する必要があります。フラグメントのスコープと責任の範囲外のイベント (別のフラグメントへのデータの送信など) がある場合、そのイベントはその親コン​​トローラーであるアクティビティにエスカレートする必要があります。

ここに画像の説明を入力

このチュートリアルから: http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity

フラグメント間で直接値を渡すよりも、アクティビティがそのフラグメントに変更を適用できるようにする方が適切です。ActivityにメソッドとのFragmentListenerインターフェースを実装させます。onQuery(Bundle data)onResult(Bundle data)

各フラグメントに変数を作成し、FragmentListener各フラグメントを次のようにオーバーライドしますonAttach()

 public void onAttach(Activity activity) {
    super.onAttach(activity);

    //---register parent activity for events---
    try{
        fragmentListener = (FragmentListener) activity;
    }catch (ClassCastException e)
    {
        throw new ClassCastException("Parent activity must implement interface FragmentListener.");
    }
  }

これにより、子フラグメントが親 Activity に自動的に登録されるようになります。

fragmentListenerまた、 で参照を解放することを忘れないでくださいonDetach()

これで、アクティビティをフラグメントから呼び出すことができます。

一方、Activity は、getFragmentManager().findFragmentByTag("fragmentA")またはを使用して常にフラグメントを検索できますfindFragmentById("FragmentA")。フラグメントを見つけることができれば、それをFragmentAクラスにキャストしてそのメソッドを呼び出すことができます。FragmentBまたは他のフラグメントでも同じことができます..

于 2012-08-24T08:20:54.733 に答える
7

考えられる解決策の1つ:

public class DetachableResultReceiver extends ResultReceiver {

private Receiver mReceiver;

public DetachableResultReceiver(Handler handler) {
    super(handler);
}

public void clearReceiver() {
    mReceiver = null;
}

public void setReceiver(Receiver receiver) {
    mReceiver = receiver;
}

public interface Receiver {
    public void onReceiveResult(int resultCode, Bundle resultData);
}

@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
    if (mReceiver != null) {
        mReceiver.onReceiveResult(resultCode, resultData);
    }
}
}

最初のフラグメントは、DetachableResultReceiver.Receiverを実装し、DetachableResultReceiverオブジェクトを作成します。

mReceiver = new DetachableResultReceiver(new Handler());
mReceiver.setReceiver(this);

次に、それを2番目のフラグメント引数に渡すことができます。

Bundle bundle = new Bundle();
bundle.putParcelable(Consts.EXTRA_RECEIVER, receiver);
fragment.setArguments(bundle);

そして、2番目のフラグメントで使用します。

receiver = getArguments().getParcelable(Consts.EXTRA_RECEIVER);
receiver.send(Consts.SOME_MESSAGE, someData);
于 2012-08-24T07:47:18.950 に答える
0

fragmentB.java で OnClickListener を設定して、メイン クラスでメソッドを実行します。fragmentB.java の引数を変数であるメイン クラスに渡し、残りの引数をメイン クラスで処理します。ただし、フラグメントはアクティビティにまったく依存するべきではありません。フラグメントは、どこでもプラグ アンド プレイできるように作成されました。

この例は、EditTextListener を示しています。

myAwesomeActivity.java

fragmentA.java

fragmentB.java

フラグメントB.java:

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);
            int x = 3;

        EditText ed1 = (EditText) getView().findViewById(R.id.editText1);
        ed1.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (MotionEvent.ACTION_UP == event.getAction()) {



                    ((myAwesomeActivity) getActivity()).myMethod(x);
                }
                return false;
            }
        });
    }

myAwesomeActivity.java:

publiv void myMethod (int x){
//Do whatever you want with variable
}

正しいタイプのリスナーを実装するだけで済みますが、要点は示されています。1 つのフラグメント アクティビティで、メソッドを呼び出し、変数をメイン アクティビティに渡します。必要に応じて、メイン アクティビティから他のフラグメント アクティビティに送信できます。

于 2012-08-24T06:12:29.213 に答える