【问题标题】:can't get a pointer on my button in a dialogfragment无法在对话框片段中的按钮上获得指针
【发布时间】:2016-11-07 01:45:58
【问题描述】:

我正在尝试构建一个简单的 DialogFragment,其中包含一个文本视图和两个按钮(发送和取消)。

我想在 textview 第一次为空时禁用按钮,但我的代码中的 positiveButton 变量始终为 null,并且出现以下异常:

 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setEnabled(boolean)' on a null object reference

这是代码:

public class SendFriendRequestFragment extends DialogFragment {
private TextView tvEmail = null;
Button positiveButton = null;

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    // Use the Builder class for convenient dialog construction
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

    // Get the layout inflater
    final LayoutInflater inflater = getActivity().getLayoutInflater();

    final View layout = inflater.inflate(R.layout.fragment_send_friend_request, null);

    // Inflate and set the layout for the dialog
    // Pass null as the parent view because its going in the dialog layout
    builder.setView(layout)
            .setTitle("Send request")
            .setPositiveButton(R.string.send, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    String email = tvEmail.getText().toString().trim();

                    if (validateInput()) {
                        SendFriendRequest(getActivity(), email);
                    } else {
                        Toast.makeText(getActivity(), "Request cannot be sent", Toast.LENGTH_LONG).show();
                        return;
                    }

                }
            })
            .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    // User cancelled the dialog
                }
            });

    Dialog dialog = builder.create();
    positiveButton = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);

    positiveButton.setEnabled(false); // positiveButton is null and this call raises an exception !
    tvEmail = (TextView) layout.findViewById(R.id.email);
    tvEmail.addTextChangedListener(new InputTextWatcher(tvEmail));
    // Create the AlertDialog object and return it
    //return builder.create();
    return dialog;
}
// Other functions that use the two variables positiveButton and tvEmail ...
}

谁能告诉我如何解决我的问题以及获取按钮指针和包含在使用的布局中的视图的最佳方法是什么?

谢谢!

【问题讨论】:

    标签: android dialog android-alertdialog android-dialogfragment


    【解决方案1】:

    在显示Dialog 之前,不会实际创建正的Button。由于您在DialogFragment 中,因此您没有直接处理Dialog 上的show() 调用。您可以在AlertDialog 上设置OnShowListener,但在DialogFragmentonStart() 方法中获取Button 可能更简单。

    @Override
    public void onStart() {
        super.onStart();
    
        positiveButton = ((AlertDialog) getDialog()).getButton(AlertDialog.BUTTON_POSITIVE);
        ...
    }
    

    【讨论】:

    • 感谢您提供的解决方案正在努力从 onBindDialogView 中抓取按钮,但可能为时过早。
    猜你喜欢
    • 2019-11-29
    • 1970-01-01
    • 2012-10-25
    • 2021-08-25
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多