java - 动态按钮的 NullPointerException 设置 onClickEvent

标签 java android nullpointerexception dialog

我有一个创建按钮的函数,该按钮有一个 onClick事件来弹出一个自定义对话框,该对话框仅显示函数参数中的一些信息。该对话框上还有两个按钮,一个用于关闭对话框,一个用于向文件添加信息。

当我尝试设置onClick时这些按钮的事件,应用程序崩溃,我得到的错误是 NullPointerException这表示我正在尝试对空对象引用调用虚拟方法。

如果我注释掉我设置 onClickEventListener 的部分两个按钮的代码,然后对话框会正常显示,上面有按钮。

注意: context是在类中声明的变量。简直就是Context context = this

代码如下:

public void addButton(String text, int id, String areas, String details, String notes) {
    Button button = new Button(this);
    final String title = "Add "+text;
    final String dName = text;
    final String dAreas = areas;
    final String dDetails = details;
    final String dNotes = notes;
    button.setText(text);
    button.setTextColor(ContextCompat.getColor(context, R.color.buttonText));
    button.setTextSize(32);
    button.setId(id);
    if (isEven(id+1)) {
        button.setBackgroundResource(R.drawable.buttonshapeother);
    } else {
        button.setBackgroundResource(R.drawable.buttonshape);
    }
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            // Make custom dialog
            final Dialog dialog = new Dialog(context);
            Button add = (Button) dialog.findViewById(R.id.btnAddExer);
            Button cancel = (Button) dialog.findViewById(R.id.btnCancel);
            dialog.setContentView(R.layout.popup_exercise);
            dialog.setTitle(title);

            // Set the custom components now
            TextView tName = (TextView) dialog.findViewById(R.id.lblNameData);
            TextView tAreas = (TextView) dialog.findViewById(R.id.lblAreaData);
            TextView tDetails = (TextView) dialog.findViewById(R.id.lblDetailsData);
            TextView tNotes = (TextView) dialog.findViewById(R.id.lblNotesData);
            tName.setText(dName);
            tAreas.setText(dAreas);
            tDetails.setText(dDetails);
            tNotes.setText(dNotes);

            // Add functions to buttons
            add.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (addExercise(dName, dAreas, dDetails, dNotes)) { // Add exercise to user's workout
                        Toast.makeText(context, "Exercise was added to your workout", Toast.LENGTH_LONG).show();
                        dialog.dismiss(); // Close dialog
                    } else {
                        Toast.makeText(context, "There was an error adding your exercise", Toast.LENGTH_LONG).show();
                    }
                }
            });
            cancel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    dialog.dismiss(); // Close dialog
                }
            });

            dialog.show(); // Actually show the dialog
        }
    });
    LinearLayout lay = (LinearLayout) findViewById(R.id.innerLay);
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    lay.addView(button, params);
}

public boolean isEven(int num) {
    if ((num&1) == 0) {
        return true;
    } else {
        return false;
    }
}

最佳答案

因为您试图在设置布局之前找到按钮 View 。所以尝试这样:

final Dialog dialog = new Dialog(context);
dialog.setContentView(R.layout.popup_exercise);
dialog.setTitle(title);
Button add = (Button) dialog.findViewById(R.id.btnAddExer);
Button cancel = (Button) dialog.findViewById(R.id.btnCancel);

关于java - 动态按钮的 NullPointerException 设置 onClickEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36646214/

相关文章:

java - 线程(textView 和进度条)

java - --i 和 i-- 的行为与++i 和 i++ 相同吗?

c++ - 抛出异常 : write access violation. newNode 为 nullptr

java - 向 StackPane 添加节点问题?

java - 数组的 gson 模型

java - pretty-print SQL 结果 Java

java - 分别想要 recyclerView 的每个 View 的屏幕截图

java - android:传递包会改变对象的类型

android - 如何将联系人姓名、号码、contact_id 保存到 ArrayList/联系人选择器

java - android - 从 .java 文件控制 XML 文件时出现 NullPointerException