本节引言:
在本节中,我们将继续学习显示提示信息的第三个控件——AlertDialog(对话框)。AlertDialog不仅是其他Dialog的父类,如ProgressDialog、TimePickerDialog等,而且它的父类是Dialog。与Toast和Notification不同,AlertDialog不能直接通过new关键字创建。如果我们想要创建一个AlertDialog,需要使用到该类中的一个静态内部类Builder,然后调用AlertDialog中的相关方法来定制我们的AlertDialog,最后调用show()方法来显示我们的AlertDialog对话框。
接下来,我们将学习AlertDialog的基本用法以及如何定制它。
1. 基本使用流程:
Step 1:创建AlertDialog.Builder对象;
Step 2:调用setIcon()设置图标,或setTitle()或setCustomTitle()设置标题;
Step 3:设置对话框的内容:通过setMessage()或其他方法指定要显示的内容;
Step 4:调用setPositive/Negative/NeutralButton()设置确定、取消、中立按钮;
Step 5:调用create()方法创建这个对象,再调用show()方法将对话框显示出来。
2. 几种常用的对话框使用示例:
运行效果图:请参考下方核心代码部分的截图。
核心代码(MainActivity.java):
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_dialog_one;
private Button btn_dialog_two;
private Button btn_dialog_three;
private Button btn_dialog_four;
private Context mContext;
private boolean[] checkItems;
private AlertDialog alert = null;
private AlertDialog.Builder builder = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = getApplicationContext();
bindView();
}
private void bindView() {
btn_dialog_one = findViewById(R.id.btn_dialog_one);
btn_dialog_two = findViewById(R.id.btn_dialog_two);
btn_dialog_three = findViewById(R.id.btn_dialog_three);
btn_dialog_four = findViewById(R.id.btn_dialog_four);
btn_dialog_one.setOnClickListener(this);
btn_dialog_two.setOnClickListener(this);
btn_dialog_three.setOnClickListener(this);
btn_dialog_four.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
//普通对话框
case R.id.btn_dialog_one:
alert = null;
builder = new AlertDialog.Builder(mContext);
alert = builder.setIcon(R.mipmap.ic_icon_fish)
.setTitle(R.string.system_prompt)
.setMessage(R.string.this_is_the_most_ordinary_alertdialog, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ToastUtil.makeText(mContext, "You clicked the cancel button~", ToastUtil.LENGTH_SHORT).show();
}
})
.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ToastUtil.makeText(mContext, "You clicked the cancel button~", ToastUtil.LENGTH_SHORT).show();
}
})
.setPositiveButton(R.string.determine, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ToastUtil.makeText(mContext, "You clicked the determine button~", ToastUtil.LENGTH_SHORT).show();
}
})
.setNeutralButton(R.string.neutral, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ToastUtil.makeText(mContext, "You clicked the neutral button~", ToastUtil.LENGTH_SHORT).show();
}
});
alert.show();
break;
//普通列表对话框
case R.id.btn_dialog_two:
final String[] lesson = new String[]{"语文", "数学", "英语", "化学", "生物", "物理", "体育"};
alert = null;
builder = new AlertDialog.Builder(mContext);
alert = builder.setIcon(R.mipmap.ic_icon_fish)
.setTitle(R.string.choose_your_favorite_course)
.setItems(lesson, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ToastUtil.makeText(getApplicationContext(), "You selected " + lesson[which], ToastUtil.LENGTH_SHORT).show();
}
});
alert.show();
break;
//单选列表对话框
case R.id.btn_dialog_three:
final String[] fruits = new String[]{"苹果", "雪梨", "香蕉", "葡萄", "西瓜", "荔枝", "火龙果"};
alert = null;
builder = new AlertDialog.Builder(mContext);
alert = builder.setIcon(R.mipmap.ic_icon_fish)
.setTitle(R.string.choose_your_favorite_fruit, fruits, new OnClickListener() {//设置点击事件监听器和按钮显示的文本内容等信息。new OnClickListener(){@Override public void onClick(View v){alert=builder; alert=alert1+builder2; alert=alert3+builder4;//在此处可以进行相应的处理。}});//在此处设置按钮显示的文本内容等信息。alert=builder;alert=alert1+builder2;alert=alert3+builder4;//在此处可以进行相应的处理。});//在此处设置按钮显示的文本内容等信息。alert=builder;alert=alert1+builder2;alert=alert3+builder4;//在此处可以进行相应的处理。))//在此处可以设置按钮显示的文本内容等信息。alert=builder;alert=alert1+builder2;alert=alert3+builder4;//在此处可以进行相应的处理。break;//结束选择课程的选项卡。case R.id.btn_dialog_four://多选项列表对话框final String[] menu=new String[]{"水煮豆腐","萝卜炖牛肉","酱油鸡","胡椒猪肚鸡"};checkItems=new boolean[]{false,false,false,false};alert=null;builder=new AlertDialog.Builder(mContext);alert=builder;alert=alert1+builder2;alert=alert3+builder4;//在此处可以进行相应的处理。));//在此处设置按钮显示的文本内容等信息。alert=builder;alert=alert1+builder2;alert=alert3+builder4;//在此处可以进行相应的处理。))//在此处可以设置按钮显示的文本内容等信息。alert=builder;alert=alert1+builder2;alert=alert3+builder4;//在此处可以进行相应的处理。break;//结束选择菜品的选项卡。default:break;}//结束选项卡的选项卡。}//结束选项卡的选项卡。}
布局非常简单,由四个简单的按钮组成。这里不再展示具体代码。使用方法非常简单,只需创建一个Builder对象,进行相关设置,然后调用create()方法生成一个AlertDialog对象,最后调用show()方法将AlertDialog显示出来即可。
需要注意的是,当用户点击对话框的外部区域时,对话框会自动消失。为了解决这个问题,我们可以在builder中为setCancelable(false)方法设置一个参数:
```
// 创建一个 Builder 对象
final Builder builder = new AlertDialog.Builder(this);
// 设置对话框标题
builder.setTitle("提示");
// 设置对话框图标
builder.setIcon(R.mipmap.ic_launcher);
// 设置按钮点击事件监听器
builder.setPositiveButton("确定", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which){
// TODO: 点击确定按钮后的操作
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which){
// TODO: 点击取消按钮后的操作
}
});
builder.show();
```
通过Builder的setView()方法,我们可以自定义一个与系统对话框不同的布局,并将其加载到AlertDialog上。下面是一个实现这个效果的示例代码:
首先是两种不同按钮的selector文件:btn_selctor_exit.xml和btn_selctor_choose.xml。
```xml
```
```xml
```
在MainActivity.java文件中,我们需要导入以下包:
```java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
```
然后,在MainActivity类的onCreate方法中,我们需要设置一个按钮和一个悬浮操作按钮:
```java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = findViewById(R.id.btn);
FloatingActionButton fab = findViewById(R.id.fab);
}
```
接下来,在onClick方法中,我们可以根据需要为按钮和悬浮操作按钮设置不同的状态栏背景图片:
```java
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 根据需求设置按钮状态栏背景图片
if (v.getId() == R.id.btn) {
v.setBackgroundResource(R.drawable.bg_btn_pressed);
} else if (v.getId() == R.id.fab) {
v.setBackgroundResource(R.drawable.mipmap_ic_add);
}
}
});
```
最后,我们可以在MainActivity类中添加一个悬浮操作按钮,并为其设置点击事件:
```java
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "悬浮操作按钮被点击", Toast.LENGTH_SHORT).show();
}
});
```
```java
public class MainActivity extends AppCompatActivity {
private Button btn_show;
private View view_custom;
private Context mContext;
private AlertDialog alert = null;
private AlertDialog.Builder builder = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
btn_show = findViewById(R.id.btn_show);
//初始化Builder
builder = new AlertDialog.Builder(mContext);
//加载自定义的那个View,同时设置下
final LayoutInflater inflater = getLayoutInflater();
view_custom = inflater.inflate(R.layout.view_dialog_custom, null, false);
builder.setView(view_custom);
builder.setCancelable(false);
alert = builder.create();
view_custom.findViewById(R.id.btn_cancle).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
alert.dismiss();
}
});
view_custom.findViewById(R.id.btn_blog).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "访问博客", Toast.LENGTH_SHORT).show();
Uri uri = Uri.parse("http://blog.csdn.net/coder_pig");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
alert.dismiss();
}
});
view_custom.findViewById(R.id.btn_close).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "对话框已关闭~", Toast.LENGTH_SHORT).show();
alert.dismiss();
}
});
btn_show.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
alert.show();
}
});
}
}
```