web-dev-qa-db-fra.com

Bind ButterKnife to Dialog échoue

J'essaie de lier ButterKnife à un AleterDialog que j'ai fait avec une méthode DialogBuilder Et existe cette méthode ButterKnife.bind(Object,Dialog); mais ne fonctionne pas pour moi

import Android.support.v4.app.DialogFragment;
import Android.support.v7.app.AlertDialog;
public class NewUserDialogFragment extends DialogFragment {
    @Bind(R.id.textuserAccount)
    EditText textuserAccount;
    @Bind(R.id.textPassword)
    EditText textPassword;
    @Bind(R.id.nauta_domains)
    Spinner nauta_domains;
    @Bind(R.id.manualConfig)
    View manualConfig;
    @Bind(R.id.checkViewPass)
    CheckBox checkViewPass;

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog dialog = new AlertDialog.Builder(getActivity())
                .setIcon(R.drawable.new_user_dialog__icon)
                .setTitle(R.string.new_user_dialog_title)
                .setView(R.layout.accountlist_dialog_user_)
                .setPositiveButton(R.string.alert_dialog_create, void_OnClickListener)
                .setNegativeButton(R.string.alert_dialog_cancel, void_OnClickListener)
                .create();
      //Fails!!!!!!!
        ButterKnife.bind(this,dialog);  
    ...

ERREUR:

Caused by: Java.lang.IllegalStateException: Required view 'textuserAccount' with ID 2131624044 for field 'textuserAccount' was not found. If this view is optional add '@Nullable' annotation.
                                                                                      at butterknife.ButterKnife$Finder.findRequiredView(ButterKnife.Java:140)

et textuserAccount = (EditText) ((Dialog) dialog).findViewById(R.id.textuserAccount); fonctionne parfaitement

Je peux utiliser le couteau à beurre d'une manière ou d'une autre dans cette classe?

Vous devez gonfler la disposition de votre boîte de dialogue et passer l'objet View résultant à butterknife.

    view = View.inflate(getContext(), R.layout.accountlist_dialog_user_, null);
    ButterKnife.bind(this, view);

Du moins, c'est comme ça que j'ai utilisé Butterknife dans les dialogues et ça marche bien pour moi.

51
Josh Kitchens

J'ai pu lier des vues dans onStart de DialogFragment (de la même façon que cet exemple d'application ), tout en utilisant la méthode AlertDialog.Builder#setView(int):

private Unbinder unbinder;

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    return new AlertDialog.Builder(getActivity())
            .setIcon(R.drawable.new_user_dialog__icon)
            .setTitle(R.string.new_user_dialog_title)
            .setView(R.layout.accountlist_dialog_user)
            .setPositiveButton(R.string.alert_dialog_create, void_OnClickListener)
            .setNegativeButton(R.string.alert_dialog_cancel, void_OnClickListener)
            .create();
}

@Override
public void onStart() {
    super.onStart();
    unbinder = ButterKnife.bind(this, getDialog());
}

@Override
public void onDestroyView() {
    super.onDestroyView();
    unbinder.unbind();
}
4
arekolek

Et tout fonctionne parfaitement

Dialog dialog = new Dialog(context); dialog.setContentView(R.layout.dialog_outcome); Unbinder unbinder = ButterKnife.bind(this, dialog);

0
user11138646