【问题标题】:void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object referenc [duplicate]空对象引用上的 void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' [重复]
【发布时间】:2019-09-20 08:39:20
【问题描述】:

我添加了一个按钮“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)

【问题讨论】:

  • 您的btnYesbtnNo 按钮是在您的主要活动上还是在对话框上?如果它们在对话框中,则不应使用MainActivityfindViewById 方法初始化它们,因为它们不存在,因此引用将是null。相反,在外部侦听器内部膨胀之后,在 AlertDialogView 对象上调用 findViewById

标签: java android using


【解决方案1】:

如果btnYesbtnNo 在对话框中,那么您应该使用AlertDialog's 查看objectinitialize 这些按钮。

你必须像下面这样修改你的代码。

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

                  }
              });


            }
        });
    }
}

希望对你有帮助。

【讨论】:

    【解决方案2】:

    如果你想显示选择是或否的对话框,使用这个

    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();
                }
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 2016-11-19
      相关资源
      最近更新 更多