AlertDialog中findViewById获取EditText返回null问题求助
问题原因
你直接调用Activity的findViewById(R.id.setText1)是错误的——这个方法只能查找当前Activity布局(即ActivityMain2Binding对应的布局)内的控件,而setText1属于自定义对话框的布局,不在Activity的视图层级里,所以返回null。另外你的代码还缺少builder.create().show()调用,否则对话框不会显示。
解决方法
下面提供两种适配你场景的解决方案,第二种更贴合你已使用ViewBinding的情况:
方案1:通过对话框视图查找控件
先加载自定义对话框的布局并保存视图实例,再从该视图内查找EditText:
private void showCustomDialog(){ // 加载自定义对话框布局 View dialogView = LayoutInflater.from(this).inflate(R.layout.custom_dialog, null); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setView(dialogView); builder.setPositiveButton("Confirm", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 从对话框视图中查找EditText EditText alertDialogText = dialogView.findViewById(R.id.setText1); if (alertDialogText != null) { System.out.println(alertDialogText.getText().toString()); } } }); builder.setNeutralButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); // 创建并显示对话框 builder.create().show(); }
方案2:用ViewBinding处理对话框布局(推荐)
既然你的Activity已经在用ViewBinding,也可以用它来绑定对话框布局,避免手动findViewById:
- 确保项目已开启ViewBinding(在模块的
build.gradle中配置):
android { buildFeatures { viewBinding true } }
- 修改
showCustomDialog方法,利用自动生成的CustomDialogBinding类:
private void showCustomDialog(){ // 用ViewBinding加载对话框布局 CustomDialogBinding dialogBinding = CustomDialogBinding.inflate(getLayoutInflater()); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setView(dialogBinding.getRoot()); builder.setPositiveButton("Confirm", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 直接通过Binding对象获取EditText内容 String inputContent = dialogBinding.setText1.getText().toString(); System.out.println(inputContent); } }); builder.setNeutralButton("Cancel", (dialog, which) -> dialog.dismiss()); // 创建并显示对话框 builder.create().show(); }
内容的提问来源于stack exchange,提问作者Vadym Melnychenko
相关产品推荐
相关产品推荐

