Receiving data from a DialogFragment if you're calling from an Activity vs a Fragment?

空扰寡人 提交于 2019-11-30 09:44:18

问题


I call my DialogFragment like so:

If I am in an Activity:

MyDialogFragment dialogfragment = new MyDialogFragment();
dialogfragment.show(getFragmentManager(), "");

If I am already in a Fragment:

MyDialogFragment dialogfragment = new MyDialogFragment();
dialogfragment.show(getActivity().getFragmentManager(), "");

In MyDialogFragment, which inflates an XML and allows the user to input some values to EditTexts and so forth, I want to be able to return those values back to wherever I called the dialog from.

For the sake of the question let's say my dialog class wants to return some private variables String mName and int mValue.

Is there a proper way to do this without knowing where the dialog is being called from (either an Activity or a Fragment)? How do I pass the values back / how do I receive them?


回答1:


If you want to send data to activity from fragment. You can do that by calling public method of activity by:

((MainActivity)getActivity()).sendData(Object object);

You can't do the same for sending data to a fragment.

As doc says:

All Fragment-to-Fragment communication is done through the associated Activity. Two Fragments should never communicate directly.

What you should do is:

  1. Define an Interface in the fragment.
  2. Implement that Interface in the activity
  3. Deliver data to the activity
  4. then activity will deliver data to some other fragment.

BTW, you can also use this practice to send data to activity (upto point 3).

Reference and example

Defining an interface:

public interface DataListener {
    public void onDataReceived(Object obj);
}

inside the fragment:

public class MyFragment extends Fragment {
    DataListener  callback;

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

       // This makes sure that the container activity has implemented
       // the callback interface. If not, it throws an exception
       try {
           callback = (DataListener) activity;
       } catch (ClassCastException e) {
           throw new ClassCastException(activity.toString()
                + " must implement DataListener");
       }
   }
}

Sending data from fragment;

callback.onDataReceived(object); // some object data

Receiving data in activity:

public static class MainActivity extends AppCompatActivity
    implements DataListener{

   public void onDataReceived(Object object) {
      // Do something here with object data
   }
}

Now if you want, you can send this data to any other fragment.

Sending data from activity to some other fragment:

AnotherFragment anotherFrag = (AnotherFragment)
 getSupportFragmentManager().findFragmentById(R.id.fragment_container);

    if (anotherFrag != null) {
        anotherFrag.receiveDataInFrag(object);
    }else{
       // create a new instance of the fragment and pass data to it.
    }



回答2:


Create a callback interface and have pass it into your dialogfragment

interface DialogValuesCallback {
   void callThisFunctionWhenUserClicksOnOkInDialog(String passinmName,int passinmValue);
}

You can have your Activity or Fragment implement this interface.

Have a constructor in your MyDialogFragment which accepts the interface and assigns it to an member variable.

MyDialogFragment(DialogValuesCallback activityOrFragmentWhichImplementsThis){
    mInterfaceCallbackObjectRef = activityOrFragmentWhichImplementsThis;
}



回答3:


@Rohit Arya this is what you should know first that fragments needs to declare an interface that must be implemented by every activity that uses that fragment so you can pass data from the fragment to the activity(s)... and must cast the activity displaying the fragment currently into this interface like this in your onAttach method

//@param Listener is the declared interface in your fragment class public class MyFragment extends Fragment { Listener mInterface;

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

           try {
               mInterface = (Listener) activity;
           } catch (ClassCastException e) {
               throw new ClassCastException(activity.toString()`
                    + " must implement DataListener");
           }
       }




    public interface Listener{

       //@param type = data type, cont = variable
 public void sendData(type cont, type2 cont2)

;

          }
    }

make sure the interface declared in your fragment get implemented in your baseActivity then what ever data you pass to the interface using

 mInterface.sendData(value, value1);

you can get it in the base activity like

public class baseActivity extends Activity implements MyFragment.Listener{

//@param cont & cont2 are data sent from MyFragment
@Override
public void sendData(type cont, type cont2){
//do what ever with your values here 

}
}

got it now?



来源:https://stackoverflow.com/questions/36363185/receiving-data-from-a-dialogfragment-if-youre-calling-from-an-activity-vs-a-fra

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!