How to pass result from second fragment to first fragment

前端 未结 4 1340

In my app I have two fragments say fragmentA and FragmentB. When I click on a button in fragmetA, a list is opened in

相关标签:
4条回答
  • 2020-12-01 18:34

    Update

    Activity is the parent controller and should take responsibility for handling those events raised by its fragments/views, which concern something outside of the scope of fragment/view itself.

    A Fragment is to act as a sub-controller of Views it hosts. All the events and communication between its own views, the fragment should handle itself. When there is an event outside of a fragment's scope and responsibilities (like sending data to another fragment), that event should be escalated to its parent controller, the Activity.

    Old

    From this tutorial : http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity

    Its better to let the activity apply changes to its fragment than passing values directly between fragments. Let your Activity implement a FragmentListener interface with onQuery(Bundle data) and onResult(Bundle data) methods.

    Create a FragmentListener varaible in each of your fragments and then override onAttach() of each fragment as:

     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.");
        }
      }
    

    This will enforce your child fragments to be automatically registered to parent Activity.

    Also, remember to release fragmentListener reference in onDetach().

    Now you can call your Activity from fragments.

    On the other side, your Activity can always search for a fragment using getFragmentManager().findFragmentByTag("fragmentA") or findFragmentById("FragmentA"). If it can find your Fragment, Then it can cast it into your FragmentA class and call its methods. Same can be done with FragmentB or any other fragment..

    0 讨论(0)
  • 2020-12-01 18:38

    One of the possible solutions:

    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);
        }
    }
    }
    

    First fragment implements DetachableResultReceiver.Receiver and creates DetachableResultReceiver object:

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

    Then you can pass it to second fragment arguments:

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

    And use it in second fragment:

    receiver = getArguments().getParcelable(Consts.EXTRA_RECEIVER);
    receiver.send(Consts.SOME_MESSAGE, someData);
    
    0 讨论(0)
  • 2020-12-01 18:43

    You can also use SharedPreferences to save some string and after return back to the first fragment load it and clear.

    0 讨论(0)
  • 2020-12-01 18:51

    In fragmentB.java set an OnClickListener to perform a method in the main class. Pass an arguement in fragmentB.java to the main class that is the variable, and handle the rest of it in your main class. Though fragments shouldn't really be dependent on activities at all. Fragments were made to plug and play anywhere.

    This Example Shows EditTextListener:

    myAwesomeActivity.java

    fragmentA.java

    fragmentB.java

    fragmentB.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
    }
    

    All you have to do is implement the correct type of listener, but the main point is shown. In one fragment activity, call a method and pass a variable to the main activity. From the main activity you can send it to your other fragment activity if you'd like.

    0 讨论(0)
提交回复
热议问题