一、基础使用流程
1. 创建并显示基础对话框
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("提示") // 设置标题
.setMessage("确认删除此项吗?") // 设置内容
.setIcon(R.drawable.ic_warning) // 设置图标
.setPositiveButton("删除", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 点击“删除”按钮的逻辑
}
})
.setNegativeButton("取消", null); // 取消按钮(无操作)
AlertDialog dialog = builder.create();
dialog.show();
-
关键方法:
-
setTitle():标题文本 -
setMessage():内容文本 -
setPositiveButton()/setNegativeButton():确认/取消按钮及事件监听 -
create()+show():创建并显示对话框
-
二、高级对话框类型
1. 带输入框的对话框
View view = getLayoutInflater().inflate(R.layout.dialog_input, null);
EditText etInput = view.findViewById(R.id.et_input);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("输入用户名")
.setView(view) // 注入自定义布局
.setPositiveButton("提交", (dialog, which) -> {
String input = etInput.getText().toString();
Toast.makeText(this, "输入内容: " + input, Toast.LENGTH_SHORT).show();
});
builder.create().show();
-
适用场景:用户输入表单(登录框、搜索框)
2. 列表选择对话框
String[] items = {"苹果", "香蕉", "橙子"};
builder.setTitle("选择水果")
.setItems(items, (dialog, which) -> {
Toast.makeText(this, "选中: " + items[which], Toast.LENGTH_SHORT).show();
});
-
特点:点击选项后自动关闭对话框
3. 单选列表对话框
int[] selectedIndex = {0}; // 记录选中位置
builder.setTitle("单选水果")
.setSingleChoiceItems(items, 0, (dialog, which) -> {
selectedIndex[0] = which; // 更新选中项
})
.setPositiveButton("确认", (dialog, which) -> {
Toast.makeText(this, "选择: " + items[selectedIndex[0]], Toast.LENGTH_SHORT).show();
});
-
关键:
setSingleChoiceItems()实现单选,需额外按钮确认选择
4. 多选列表对话框
boolean[] checkedItems = new boolean[]{false, false, false}; // 初始状态
builder.setTitle("多选爱好")
.setMultiChoiceItems(items, null, (dialog, which, isChecked) -> {
checkedItems[which] = isChecked; // 更新选中状态
})
.setPositiveButton("提交", (dialog, which) -> {
StringBuilder result = new StringBuilder();
for (int i = 0; i < checkedItems.length; i++) {
if (checkedItems[i]) result.append(items[i]).append(" ");
}
Toast.makeText(this, "选择: " + result, Toast.LENGTH_SHORT).show();
});
-
关键:
setMultiChoiceItems()+ 布尔数组记录状态
三、自定义布局与样式
1. 完全自定义布局
<!-- res/layout/dialog_custom.xml -->
<LinearLayout>
<TextView android:id="@+id/tv_title" ... />
<EditText android:id="@+id/et_input" ... />
</LinearLayout>
View customView = LayoutInflater.from(this).inflate(R.layout.dialog_custom, null);
builder.setView(customView); // 替换默认布局
-
优势:自由添加复杂控件(如日期选择器、图片)
2. 动态修改样式
// 修改按钮颜色(API 21+)
AlertDialog dialog = builder.create();
dialog.setOnShowListener(dialogInterface -> {
Button btnPositive = dialog.getButton(AlertDialog.BUTTON_POSITIVE);
btnPositive.setTextColor(Color.RED);
});
四、注意事项与最佳实践
-
生命周期管理
-
避免内存泄漏:在
Activity/Fragment销毁时关闭对话框:@Override protected void onDestroy() { if (dialog != null && dialog.isShowing()) dialog.dismiss(); super.onDestroy(); } -
配置变更处理:使用
DialogFragment替代直接创建,防止旋转时崩溃
-
-
线程安全
-
禁止在子线程中更新对话框(
show()/dismiss()需在主线程执行)。
-
-
用户体验优化
-
重要操作前置:确认按钮(如“删除”)放在右侧(Android 设计规范)。
-
输入校验:在
OnClickListener中验证输入合法性(如非空检查)。
-
五、完整功能示例
public class MainActivity extends AppCompatActivity {
private AlertDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_show).setOnClickListener(v -> showMultiChoiceDialog());
}
private void showMultiChoiceDialog() {
String[] options = {"音乐", "运动", "阅读"};
boolean[] checkedItems = new boolean[options.length];
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("选择兴趣爱好")
.setMultiChoiceItems(options, checkedItems, (dialog, which, isChecked) -> {
checkedItems[which] = isChecked;
})
.setPositiveButton("提交", (d, which) -> {
StringBuilder result = new StringBuilder();
for (int i = 0; i < checkedItems.length; i++) {
if (checkedItems[i]) result.append(options[i]).append(", ");
}
Toast.makeText(this, "已选择: " + result, Toast.LENGTH_SHORT).show();
})
.setNegativeButton("取消", null);
dialog = builder.create();
dialog.show();
}
}
六、不同类型对话框对比
|
类型 |
核心方法 |
适用场景 |
特点 |
|---|---|---|---|
|
基础提示 |
|
确认操作、警告信息 |
简单文本 + 按钮 |
|
输入框 |
|
表单输入 |
需自定义布局 |
|
列表选择 |
|
单选操作(如分类选择) |
点击即关闭 |
|
单选列表 |
|
单选设置(如主题切换) |
需确认按钮提交 |
|
多选列表 |
|
多选设置(如兴趣选择) |
需记录选中状态 |
最佳实践:
简单交互 → 使用内置样式(
setItems)复杂表单 → 自定义布局(
setView)数据持久化 → 通过回调接口传递结果到
Activity/Fragment代码规范:避免匿名内部类嵌套过深(可提取为成员变量或Lambda)
473

被折叠的 条评论
为什么被折叠?



