将ButterKnife绑定到Dialog失败。

16

我尝试将ButterKnife绑定到使用DialogBuilder方法创建的AlertDialog上,存在这个方法 ButterKnife.bind(Object,Dialog); 但对我不起作用。

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);  
    ...

错误:

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)

textuserAccount = (EditText) ((Dialog) dialog).findViewById(R.id.textuserAccount);这句话可以完美地运行。

我能在这个类里以某种方式使用butterknife吗?

3个回答

56
您需要填充对话框布局并将生成的View对象传递给butterknife。
    view = View.inflate(getContext(), R.layout.accountlist_dialog_user_, null);
    ButterKnife.bind(this, view);

至少,这是我在对话框中使用Butterknife的方式,而且对我来说效果很好。


好的,最终的解决方案是将这个充气的视图传递给对话框:new AlertDialog.Builder(getActivity())...setView(view) - Rolando Corratge Nieves
1
问题已解决。谢谢伙计。 - X09

5

我能够在DialogFragmentonStart方法中绑定视图(类似于这个示例应用程序),同时仍然使用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();
}

1
And everything works perfect(一切都运行完美)

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

对话框(Dialog)实例化并设置内容视图为dialog_outcome布局。使用ButterKnife绑定视图,返回一个Unbinder对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接