0

I am calling a Fragment Dialogue from a Fragment, and when I try to impliment a callback it isn't calling back to the Fragment, I think it is calling back to the Activity. I believe this is by design from Google, is there anyway around that? How can couple the Dialogue Fragment to the Fragment?

My code is as follows;

Dialogue Fragment

public class CustomDatePicker extends DialogFragment {

    private DateListener listener;

    ...

    public interface DateListener {
        void onDateComplete();
    }

}

Fragment

public class User extends Fragment implements CustomDatePicker.DateListener {

    ...

    @Override
    public void onDateComplete() {
        Log.i("TEST", "onDateComplete: " + date);
    }

}
glend
  • 1,592
  • 1
  • 17
  • 36
  • 1
    How and where do you call the listener? And where do you set it? – ElDuderino Jun 26 '17 at 19:10
  • @ElDuderino, I don't. How would I do that? – glend Jun 26 '17 at 19:11
  • 1
    Well just because you have one class implement an interface doesn't mean it will receive any events. Have a look at this answer (https://stackoverflow.com/a/6270150/2001247), it will explain how listeners work. – ElDuderino Jun 26 '17 at 19:17

3 Answers3

1

For those purposes you can use setTargetFragment()and onActivityResult(). Check this: Receive result from DialogFragment or Callback to a Fragment from a DialogFragment. In this case you dont need any interfaces.

Interfaces:

public class CustomDatePicker extends DialogFragment {

    private DateListener listener;

    public interface DateListener {
        void onDateComplete(long date);
    }

    public void setListener(DateListener listener) {
        this.listener = listener;
    }

    public void sendToFragment(long value) {  //value you want to pass
        if (listener != null) {
            listener.onDateComplete(value);
        }
    }
}

and

public class User extends Fragment implements CustomDatePicker.DateListener  {

    public void showDialog(){
        CustomDatePicker datePicker = new CustomDatePicker();
        datePicker.setListener(this); // since User fragment implements it

        ...

        datePicker.show(getFragmentManager(), "TAG");
    }

    @Override
    public void onDateComplete(long date) {
        Log.d("Interface", "onDateComplete: " + date);
    }
}

Call sendToFragment() with your value where you need, hope this help.

kara4k
  • 407
  • 5
  • 11
0

instead of implementing your listener to your fragment get a new instance of your dialog fragment and new your listener when you want to call it add newInstance to your dialog fragment like this:

public static CustomDatePicker newInstance(DateListener listener) {
    return  new CustomDatePicker();
}

and show your dialog fragment in this way:

CustomDatePicker.newInstance(new CustomDatePicker.DateListener() {
      @Override
      public void onDialogPositiveListener(DialogFragment dialog) {
}).show(getFragmentManager(), "tag");

so you can get result in your code

Meikiem
  • 1,876
  • 2
  • 11
  • 19
0

What I ended up doing, based off of comments and answers was the following.

Dialogue Fragment;

public class CustomDatePicker extends DialogFragment {

private DateListener listener;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

...

Button btnSave = (Button) v.findViewById(R.id.save);
    btnSave.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getDate();
            dismiss();
            listener.onDateComplete();
        }
    });

...

}

...

public interface DateListener {
    void onDateComplete();
}

}

Fragment;

public class User extends Fragment {

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

...

    CustomDatePicker customDatePicker = new CustomDatePicker();
    customDatePicker.setListener(new CustomDatePicker.DateListener() {
        @Override
        public void onDateComplete() {
            adapter.notifyDataSetChanged();
        }
    });

...

}

...

}
glend
  • 1,592
  • 1
  • 17
  • 36