一、简单的内容文本弹出式对话框
还是一样MainActivity的布局文件就不放上了,就是一个简单的Button控件,在Java代码中为其绑定了一个监听器。
首先我们需要创建这个AlertDialog,因此我们新建一个方法initDialog,在此之前我们需要在全局声明一个AlertDialog对象(AlertDialog alertDialog;),下面的方法中就是在全局声明了AlertDialog对象的前提下。
/*
初始化AlertDialog
*/
public void initDialog()
{
//创建AlertDialog的构造器的对象
AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
//设置构造器标题
builder.setTitle("提示");
//构造器对应的图标
builder.setIcon(R.mipmap.ic_launcher);
//构造器内容,为对话框设置文本项(之后还有列表项的例子)
builder.setMessage("你是否要狠心离我而去?");
//为构造器设置确定按钮,第一个参数为按钮显示的文本信息,第二个参数为点击后的监听事件,用匿名内部类实现
builder.setPositiveButton("是呀", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
//第一个参数dialog是点击的确定按钮所属的Dialog对象,第二个参数which是按钮的标示值
finish();//结束App
}
});
//为构造器设置取消按钮,若点击按钮后不需要做任何操作则直接为第二个参数赋值null
builder.setNegativeButton("不呀",null);
//为构造器设置一个比较中性的按钮,比如忽略、稍后提醒等
builder.setNeutralButton("稍后提醒",null);
//利用构造器创建AlertDialog的对象,实现实例化
alertDialog=builder.create();
}
在创建AlertDialog对象成功后,在需要显示AlertDialog时用alertDialog.show()即可,否则无法显示。
由于项目要求是App在退出时跳出弹出式对话框提醒用户是否退出,因此需要重写Android系统返回按键的监听事件
/**
* 表示点击安卓系统返回键时触发的回调方法
*/
@Override
public void onBackPressed()
{
//当AlertDialog存在实例对象并且没有在展示时
if(alertDialog!=null&&!alertDialog.isShowing())
{
alertDialog.show();
}
}
下面放上整个App的代码
package com.studio.alertdialogdemo;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
/*
演示AlertDialog的基本使用
*/
public class MainActivity extends AppCompatActivity
{
private AlertDialog alertDialog;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initDialog();
}
/*
初始化AlertDialog
*/
public void initDialog()
{
//创建AlertDialog的构造器的对象
AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
//设置构造器标题
builder.setTitle("提示");
//构造器对应的图标
builder.setIcon(R.mipmap.ic_launcher);
//构造器内容,为对话框设置文本项(之后还有列表项的例子)
builder.setMessage("你是否要狠心离我而去?");
//为构造器设置确定按钮,第一个参数为按钮显示的文本信息,第二个参数为点击后的监听事件,用匿名内部类实现
builder.setPositiveButton("是呀", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
//第一个参数dialog是点击的确定按钮所属的Dialog对象,第二个参数which是按钮的标示值
finish();//结束当前Activity
}
});
//为构造器设置取消按钮,若点击按钮后不需要做任何操作则直接为第二个参数赋值null
builder.setNegativeButton("不呀",null);
//为构造器设置一个比较中性的按钮,比如忽略、稍后提醒等
builder.setNeutralButton("稍后提醒",null);
//利用构造器创建AlertDialog的对象,实现实例化
alertDialog=builder.create();
}
/*
实现Button监听器的除了内部类外的方法
点击Button时弹出AlertDialog
*/
public void showDialog(View v)
{
//当AlertDialog存在实例对象并且没有在展示时
if(alertDialog!=null&&!alertDialog.isShowing())
alertDialog.show();
}
/**
* 表示点击安卓系统返回键时回调的方法
*/
@Override
public void onBackPressed()
{
//当AlertDialog存在实例对象并且没有在展示时
if(alertDialog!=null&&!alertDialog.isShowing())
{
alertDialog.show();
}
}
}
当我们点击了返回键时,效果图如图
之后只有我们点击是呀才会退出当前App
二、列表式弹出式对话框
首先放上布局文件效果图
我们最终要实现的效果就是:
1、点击设置字体颜色按钮,弹出一个列表式对话框,当我们点击其中的列表项时MainActivity中的TextView文本内容HelloWorld会变成对应的颜色
/**
* 创建并显示普通列表的AlertDialog方法
*/
public void showListDialog()
{
AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
builder.setTitle("设置字体颜色");
/*利用android.R.drawable.xxx调用安卓系统内置图标*/
builder.setIcon(android.R.drawable.btn_star);
/*利用setItems方法为Dialog设置列表项,setItems(数据源的资源ID[这里的资源是一个定义在string.xml中的字符串数组],点击item中的选项时触发的监听事件)*/
builder.setItems(R.array.colors_name, new DialogInterface.OnClickListener()
{
/*int which 表示点击的item在string.xml文件字符串数组中的下标*/
@Override
public void onClick(DialogInterface dialog, int which)
{
switch (which)
{
case 0:
{
textView.setTextColor(Color.RED);
break;
}
case 1:
{
textView.setTextColor(Color.GREEN);
break;
}
case 2:
{
textView.setTextColor(Color.BLUE);
break;
}
}
}
});
builder.create().show();
}
以下是列表项的资源文件(string.xml中的一个string-array)
<resources>
<string name="app_name">AlertDialogListstring>
<string name="str_color">设置字体颜色string>
<string-array name="colors_name">
<item>红色item>
<item>绿色item>
<item>蓝色item>
string-array>
resources>
三、单选列表弹出式对话框
当我们点击设置字体大小按钮时,弹出一个单选列表对话框,我们选择一种字号后MainActivity中的TextView文本内容就会变化成对应的字号,string.xml文件中设置的是小号为15sp,中号为20sp,大号为25sp,特大号为30sp,并且选择后该对话框自动消失。
首先创建这个单选式对话框
/**
* 展示单选列表AlertDialog的方法
*/
public void showSingleListDialog()
{
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setTitle("设置字体大小");
builder.setIcon(android.R.drawable.btn_star);
//为AlertDialog设置单选列表
//setSingleChoiceItems(数据资源id,默认被选中的item下标[-1表示没有默认选中],点击item触发的监听事件)
builder.setSingleChoiceItems(R.array.font_name, checkedItemId, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
checkedItemId=which;
switch (which)
{
case 0:textView.setTextSize(15);break;
case 1:textView.setTextSize(20);break;
case 2:textView.setTextSize(25);break;
case 3:textView.setTextSize(30);break;
}
alertDialog.dismiss();//表示点击item后自动关闭整个Dialog,因为单选列表Dialog选择后是不会自动关闭的,因此需要此语句辅助关闭。
}
});
alertDialog=builder.create();
alertDialog.show();
}
单选式列表资源文件
<resources>
<string name="app_name">AlertDialogListstring>
<string name="str_color">设置字体颜色string>
<string-array name="font_name">
<item>小号item>
<item>中号item>
<item>大号item>
<item>特大号item>
string-array>
resources>
四、图文列表式对话框
这种图文并存的对话框稍微复杂一些,涉及到适配器的问题,因此具体将会在ListView的学习中详细讲解,这里先放上效果图及代码。
在点击设置按钮之后会弹出图文列表式对话框,之后点击其中的列表项将会跳转到安卓系统对应的设置界面。
/**
* 展示适配器列表AlertDialog,即图片文本列表
*/
public void showAdapterListDialog()
{
AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
builder.setTitle("打开设置");
builder.setIcon(android.R.drawable.btn_star);
//获得列表项显示的文本数组
String[] stringNames=getResources().getStringArray(R.array.setting_names);
//获得列表项显示的图片名称数组
String[] imageNames=getResources().getStringArray(R.array.setting_images);
//创建SimpleAdapter的数据源,String为列表中每一行显示的类型名称(如图片、文字),Object是因为显示的有文字又有图片所以用Object
List
对应图文列表项的资源文件,注意要先将image01~image04放到drawable文件夹下。
<resources>
<string name="app_name">AlertDialogListstring>
<string name="str_color">设置字体颜色string>
<string-array name="setting_names">
<item>wifi设置item>
<item>蓝牙设置item>
<item>声音设置item>
<item>日期设置item>
string-array>
<string-array name="setting_images">
<item>image01item>
<item>image02item>
<item>image03item>
<item>image04item>
string-array>
resources>
最后放上一整个项目的整体Java代码和布局文件
<resources>
<string name="app_name">AlertDialogListstring>
<string name="str_color">设置字体颜色string>
<string-array name="colors_name">
<item>红色item>
<item>绿色item>
<item>蓝色item>
string-array>
<string-array name="setting_names">
<item>wifi设置item>
<item>蓝牙设置item>
<item>声音设置item>
<item>日期设置item>
string-array>
<string-array name="setting_images">
<item>image01item>
<item>image02item>
<item>image03item>
<item>image04item>
string-array>
<string-array name="font_name">
<item>小号item>
<item>中号item>
<item>大号item>
<item>特大号item>
string-array>
<string-array name="font_value">
<item>15item>
<item>20item>
<item>25item>
<item>30item>
string-array>
resources>
package com.studio.alertdialoglist;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.provider.Settings;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* 演示AlertDialog中各种列表形式
*/
public class MainActivity extends AppCompatActivity
{
private Button button_color,button_setting,button_size;
private TextView textView;
private AlertDialog alertDialog;
private int checkedItemId=0;//AlertDialog单选列表中默认被选中的item下标;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
public void initView()
{
button_size= (Button) findViewById(R.id.button_size);
button_color=(Button) findViewById(R.id.button_color);
button_setting=(Button) findViewById(R.id.button_setting);
textView=(TextView) findViewById(R.id.textView);
button_color.setOnClickListener(new ButtonListener());
button_setting.setOnClickListener(new ButtonListener());
button_size.setOnClickListener(new ButtonListener());
}
class ButtonListener implements View.OnClickListener
{
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.button_color: //设置字体的颜色
{
showListDialog();
break;
}
case R.id.button_setting: //设置界面
{
showAdapterListDialog();
break;
}
case R.id.button_size://设置字体大小
{
showSingleListDialog();
break;
}
}
}
}
/**
* 创建普通列表的AlertDialog方法
*/
public void showListDialog()
{
AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
builder.setTitle("设置字体颜色");
//利用android.R.drawable.xxx调用安卓系统内置图标
builder.setIcon(android.R.drawable.btn_star);
//利用setItems方法为Dialog设置列表项,setItems(数据源的资源ID[这里的资源是一个定义在string.xml中的字符串数组],点击item中的选项时触发的监听事件)
builder.setItems(R.array.colors_name, new DialogInterface.OnClickListener()
{
//int which 表示点击的item在string.xml文件字符串数组中的下标
@Override
public void onClick(DialogInterface dialog, int which)
{
switch (which)
{
case 0:
{
textView.setTextColor(Color.RED);
break;
}
case 1:
{
textView.setTextColor(Color.GREEN);
break;
}
case 2:
{
textView.setTextColor(Color.BLUE);
break;
}
}
}
});
builder.create().show();
}
/**
* 展示适配器列表AlertDialog,即图片文本列表
*/
public void showAdapterListDialog()
{
AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
builder.setTitle("打开设置");
builder.setIcon(android.R.drawable.btn_star);
//获得列表项显示的文本数组
String[] stringNames=getResources().getStringArray(R.array.setting_names);
//获得列表项显示的图片名称数组
String[] imageNames=getResources().getStringArray(R.array.setting_images);
//创建SimpleAdapter的数据源,String为列表中每一行显示的类型名称(如图片、文字),Object是因为显示的有文字又有图片所以用Object
List> data=new ArrayList>();
for(int i=0;i map=new HashMap();
map.put("setting",stringNames[i]);
//getIdentifier() 根据资源的名称和类型获取资源的id
int imageId=getResources().getIdentifier(imageNames[i],"drawable",getPackageName());
map.put("image",imageId);
data.add(map);
}
SimpleAdapter adapter=new SimpleAdapter(this,data,R.layout.list_item,
new String[]{"setting","image"},new int[]{R.id.tv_name,R.id.iv_logo});
//setAdapter(适配器对象,点击列表项触发的监听事件)
builder.setAdapter(adapter, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
Intent intent=null;
//which指的也是每个列表项的下标,从0开始
switch (which)
{
case 0://点击wifi设置项,则创建一个可以跳转到Android系统WiFi设置页面的intent对象
{
intent=new Intent(Settings.ACTION_WIFI_SETTINGS);
break;
}
case 1://蓝牙设置
{
intent=new Intent(Settings.ACTION_BLUETOOTH_SETTINGS);
break;
}
case 2://声音设置
{
intent=new Intent(Settings.ACTION_SOUND_SETTINGS);
break;
}
case 3://日期设置
{
intent = new Intent(Settings.ACTION_DATE_SETTINGS);
break;
}
}
startActivity(intent);//跳转到相应的界面
}
});
builder.create().show();
}
/**
* 展示单选列表AlertDialog的方法
*/
public void showSingleListDialog()
{
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setTitle("设置字体大小");
builder.setIcon(android.R.drawable.btn_star);
//为AlertDialog设置单选列表
//setSingleChoiceItems(数据资源id,默认被选中的item下标[-1表示没有默认选中],点击item触发的监听事件)
builder.setSingleChoiceItems(R.array.font_name, checkedItemId, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
checkedItemId=which;
switch (which)
{
case 0:textView.setTextSize(15);break;
case 1:textView.setTextSize(20);break;
case 2:textView.setTextSize(25);break;
case 3:textView.setTextSize(30);break;
}
alertDialog.dismiss();//表示点击item后自动关闭整个Dialog,因为单选列表Dialog选择后是不会自动关闭的,因此需要此语句辅助关闭。
}
});
alertDialog=builder.create();
alertDialog.show();
}
}
有关其他Dialog的基础知识见桌面Android文件夹下的”Dialog基础知识.pdf”