androidandroid-fragmentslistener

pass or listen to data from BottomSheetDialogFragment to caller Fragment


Im trying to listen or pass data from an BotomSheetDialogFragment into Fragment to change something on the Fragment (Just like a picker).

I've tried with getTargetFragment to instantiate the listener but getting a compiler error Found: 'MyFragment', required: 'android.support.v4.app.Fragment' less..

Any ideas or i'm takin the wrong approach?

public class MyBottomSheetDialogFragment extends BottomSheetDialogFragment implements View.OnClickListener {


ReportType reportType;

public interface OnChooseReasonListener {
    void onChooseReason(ReportType reportType);
}

OnChooseReasonListener listener;

@Override
public void setupDialog(Dialog dialog, int style) {
    super.setupDialog(dialog, style);
    View contentView = View.inflate(getContext(), R.layout.picker_bottom_sheet_, null);
    dialog.setContentView(contentView);
    CoordinatorLayout.LayoutParams layoutParams =
            (CoordinatorLayout.LayoutParams) ((View) contentView.getParent()).getLayoutParams();
    CoordinatorLayout.Behavior behavior = layoutParams.getBehavior();

    //get null here!!!:
    listener = (OnChooseReasonListener)  getParentFragment();// or with getTargetFragment();
  }

  @Override
public void onClick(View view) {
    switch (view.getId()){
        case R.id.cool_button:
            this.reportType = ReportType.ME;
            //trying to execute the lisstener on null
            listener.onChooseReason(this.reportType);
            dismiss();
            break;
    }
}}

And the fragment:

    public class MyFragment extends Fragment 
  implements View.OnClickListener, 
  MyBottomSheetDialogFragment.OnChooseReasonListener {
//....code here
  public void showPicker() {
        //getting and compiler error Wrong 1st argument type. 
        // picker. setTargetFragment(MyFragment.this , 300);
         picker.show(fm, picker.getTag());
     }
   @Override
    public void onChooseReason(ReportType reportType) {
        //not getting here
        Log(TAG, "You choose something" + reportType.getValue());
    }
}

Solution

  • Besides that it's not working, that code smells a little since you're coupling MyBottomSheetDialogFragment with the object that created it.

    The correct approach would be to have a method void setOnChooseReasonListener(OnChooseReasonListener listener) on MyBottomSheetDialogFragment and call it when you create the instance.

    myBottomSheetDialogFragment.setOnChooseReasonListener(this);