为Dialog按钮设置setOnClickListener导致App崩溃求助
问题排查与修复
核心崩溃原因
你在获取Dialog内的EditText和Button时,错误使用了Activity的findViewById()方法——这些控件属于Dialog的布局add_layout.xml,并非Activity主布局activity_main.xml的一部分。直接调用findViewById()会返回null,给null对象设置点击监听时,会触发空指针异常(NullPointerException),导致App崩溃。
修复步骤
1. 修正Dialog控件获取方式
将Dialog内控件的获取代码,从findViewById()改为dialog.findViewById(),确保从Dialog的布局中查找控件:
btnOpenDialog.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Dialog dialog = new Dialog(MainActivity.this); dialog.setContentView(R.layout.add_layout); // 关键修改:通过dialog对象获取内部控件 EditText name = dialog.findViewById(R.id.nameid); EditText number = dialog.findViewById(R.id.numberid); Button buttonSubmit = dialog.findViewById(R.id.buttonid); buttonSubmit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 后续逻辑... } }); dialog.show(); // 建议将show()放在监听设置之后,避免控件未初始化完成就显示 } });
2. 修复输入判断逻辑错误
你当前的输入判断逻辑完全颠倒,应该判断输入内容是否为空,而非判断空字符串与输入内容的关系:
@Override public void onClick(View v) { String nameAdded = name.getText().toString().trim(); String numAdded = number.getText().toString().trim(); if(nameAdded.isEmpty()){ Toast.makeText(MainActivity.this,"请输入姓名",Toast.LENGTH_SHORT).show(); return; } if(numAdded.isEmpty()){ Toast.makeText(MainActivity.this,"请输入号码",Toast.LENGTH_SHORT).show(); return; } // 新增联系人时传入默认图片,避免Adapter加载图片崩溃 ContactModel modelAdd = new ContactModel(R.drawable.ic_add_contact, nameAdded, numAdded); arrContact.add(modelAdd); adapterCustom.notifyItemInserted(arrContact.size()-1); recyclerView.scrollToPosition(arrContact.size()-1); dialog.dismiss(); }
3. 解决新增联系人无图片的崩溃问题
你的RecyclerContactAdapterCustom在onBindViewHolder中会调用holder.imgContact.setImageResource()加载图片,但新增联系人时使用的无参图片构造方法未初始化img字段,默认值为0会导致加载图片崩溃。需要给新增联系人设置默认图片,或在Adapter中增加空判断。
完整修复后的MainActivity关键代码片段
btnOpenDialog.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Dialog dialog = new Dialog(MainActivity.this); dialog.setContentView(R.layout.add_layout); EditText name = dialog.findViewById(R.id.nameid); EditText number = dialog.findViewById(R.id.numberid); Button buttonSubmit = dialog.findViewById(R.id.buttonid); buttonSubmit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String nameAdded = name.getText().toString().trim(); String numAdded = number.getText().toString().trim(); if (nameAdded.isEmpty()) { Toast.makeText(MainActivity.this, "请输入姓名", Toast.LENGTH_SHORT).show(); return; } if (numAdded.isEmpty()) { Toast.makeText(MainActivity.this, "请输入号码", Toast.LENGTH_SHORT).show(); return; } // 使用带图片参数的构造方法,传入默认联系人图标 ContactModel modelAdd = new ContactModel(R.drawable.ic_add_contact, nameAdded, numAdded); arrContact.add(modelAdd); adapterCustom.notifyItemInserted(arrContact.size() - 1); recyclerView.scrollToPosition(arrContact.size() - 1); dialog.dismiss(); } }); dialog.show(); } });
内容的提问来源于stack exchange,提问作者Anmol Thakur
相关产品推荐
相关产品推荐

