2017-09-07 1 views
0

J'essaie d'écouter ou de transmettre des données d'un BotomSheetDialogFragment à Fragment pour changer quelque chose sur le Fragment (Tout comme un sélecteur).transmettre ou écouter des données de BottomSheetDialogFragment à Fragment

J'ai essayé avec getTargetFragment instancier l'auditeur, mais obtenir une erreur du compilateur Fonder: « MyFragment », nécessaire: « android.support.v4.app.Fragment » .. moins

Toutes les idées ou i » m prendre la mauvaise approche?

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

Et le 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()); 
    } 
} 

Répondre

1

En outre, il ne fonctionne pas, ce code sent un peu puisque vous MyBottomSheetDialogFragment couplage avec l'objet qui l'a créé.

L'approche correcte serait d'avoir une méthode void setOnChooseReasonListener(OnChooseReasonListener listener) sur MyBottomSheetDialogFragment et de l'appeler lorsque vous créez l'instance.

myBottomSheetDialogFragment.setOnChooseReasonListener(this); 
+0

Merci, vous avez raison. J'ai besoin de beaucoup d'expérience et d'études pour aller mieux. Et merci de m'aider à voir la réponse. Il me manque aussi de poster le code pour instancier la BottomSheet. Voici comment j'ai résolu cela à partir du fragment: 'public void showPicker() { MyBottomSheetDialogFragment bottomsheetPicker = new MyBottomSheetDialogFragment(); bottomsheetPicker.setOnChooseReasonListener (this); bottomsheetPicker.show (fm, MyBottomSheetDialogFragment.getTag()); } ' – Xaren