在空对象Referenc上无效android.widget.Button.setOnClickListener(android.view.View $ OnClickListener)'

时间:2019-09-20 08:39:20

标签: java android using

我添加了一个按钮“ btn”。我设置了onclicklistener,在按钮“ btn”内添加了另一个按钮“ btnYes”,以在添加这些“ btnYes”应用程序崩溃时显示自定义对话框。

当我删除“ btnyes”按钮时,应用程序正在运行。 我们可以在一个按钮内为两个按钮添加onclicklistener来完成不同的工作吗?

Java代码

public class MainActivity extends AppCompatActivity {
    private Button btn, btnYes, btnNo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = findViewById(R.id.click);
        btnYes = findViewById(R.id.yes);
        btnNo = findViewById(R.id.no);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder dialogBox = new AlertDialog.Builder(MainActivity.this);
                LayoutInflater inflater = LayoutInflater.from(MainActivity.this);

                View myView = inflater.inflate(R.layout.custom_dialogbox, null);
                dialogBox.setView(myView);
                final AlertDialog mybuilder = dialogBox.create();
                mybuilder.setCancelable(false);
              btnYes.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      mybuilder.dismiss();

                  }
              });


            }
        });
    }
}
  

尝试在空对象引用上调用虚拟方法'void android.widget.Button.setOnClickListener(android.view.View $ OnClickListener)'           在com.example.customdialog.MainActivity $ 1.onClick(MainActivity.java:33)

2 个答案:

答案 0 :(得分:2)

如果对话框中有btnYesbtnNo,则应使用initialize视图AlertDialog'sobject这些按钮。

您必须像下面那样修改代码。

public class MainActivity extends AppCompatActivity {
    private Button btn, btnYes, btnNo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = findViewById(R.id.click);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder dialogBox = new AlertDialog.Builder(MainActivity.this);
                LayoutInflater inflater = LayoutInflater.from(MainActivity.this);

                View myView = inflater.inflate(R.layout.custom_dialogbox, null);

                // these button should be initialize here.
                 btnYes = myView.findViewById(R.id.yes);
                 btnNo = myView.findViewById(R.id.no);

                dialogBox.setView(myView);
                final AlertDialog mybuilder = dialogBox.create();
                mybuilder.setCancelable(false);
              btnYes.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      mybuilder.dismiss();

                  }
              });


            }
        });
    }
}

希望它对您有帮助。

答案 1 :(得分:1)

如果要显示“是”或“否”对话框,请使用

AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage(message)
                .setCancelable(false)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        // action for yes

                    }
                })
                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        // action for no

                    }
                });
        AlertDialog alert = builder.create();
        alert.show();

但是,如果您要使用自定义对话框布局,则应该这样做。

final Dialog dialog = new Dialog(this);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.YOUR_LAYOUT_HERE);
        Button btnyes= dialog.findViewById(R.id.btnyes);

btnyes.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.cancel();
            }
        });