Android 之 控件 - AlertDialog

​一、基础使用流程​

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

 ​​四、注意事项与最佳实践​

  1. ​生命周期管理​

    • ​避免内存泄漏​​:在 Activity/Fragment销毁时关闭对话框:

      @Override
      protected void onDestroy() {
          if (dialog != null && dialog.isShowing()) dialog.dismiss();
          super.onDestroy();
      }
    • ​配置变更处理​​:使用 DialogFragment替代直接创建,防止旋转时崩溃 

  2. ​线程安全​

    • 禁止在子线程中更新对话框(show()/dismiss()需在主线程执行)。

  3. ​用户体验优化​

    • ​重要操作前置​​:确认按钮(如“删除”)放在右侧(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();
    }
}

 ​​六、不同类型对话框对比​

​类型​

​核心方法​

​适用场景​

​特点​

​基础提示​

setMessage()

确认操作、警告信息

简单文本 + 按钮

​输入框​

setView()EditText

表单输入

需自定义布局

​列表选择​

setItems()

单选操作(如分类选择)

点击即关闭

​单选列表​

setSingleChoiceItems()

单选设置(如主题切换)

需确认按钮提交

​多选列表​

setMultiChoiceItems()

多选设置(如兴趣选择)

需记录选中状态

​最佳实践​​:

  • ​简单交互​​ → 使用内置样式(setItems

  • ​复杂表单​​ → 自定义布局(setView

  • ​数据持久化​​ → 通过回调接口传递结果到 Activity/Fragment

  • ​代码规范​​:避免匿名内部类嵌套过深(可提取为成员变量或Lambda)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值