导读
1.普通对话框AlertDialog
2.列表对话框ListDialog
3.单选对话框SingleDialog
4.多选对话框MultiDialog
5.输入对话框InputDialog
6.等待对话框WaitingDialog
7.进度条对话框ProgressDialog
8.自定义对话框Dialog
9.适配器的运用ArrayDialog
普通对话框AlertDialog
第一种:通过构建器
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="200dp"
android:onClick="click"
android:text="Button" />
</LinearLayout>
java文件
package com.hala.view01;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.icu.util.Calendar;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.IdRes;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hala);
}
public void click(View v){
/*
AlertDialog的构造函数是被protected修饰的,所以包外是无法访问的,因此这里我们用构建器
*/
AlertDialog.Builder dialog=new AlertDialog.Builder(this);
//设置标题
dialog.setTitle("Emilia Clarke");
//设置内容
dialog.setMessage("Do you like Emilia Clarke?");
//设置按钮,第一个参数是文本,第二个参数是按钮摆放在哪里以及点击后的反应
dialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//退出程序
MainActivity.this.finish();
}
});
dialog.setNeutralButton("just soso", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "hahahha", Toast.LENGTH_SHORT).show();
}
});
dialog.setNegativeButton("No",null);
//注意这里show()方法中就包括了create()方法,所以这里不用先create()
dialog.show();
}
/*
简写方法
public void click(View v){
AlertDialog.Builder dialog=new AlertDialog.Builder(this);
dialog.setTitle("Emilia Clarke")
.setMessage("Do you like Emilia Clarke?")
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//退出程序
MainActivity.this.finish();
}
})
.setNeutralButton("just soso", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "hahahha", Toast.LENGTH_SHORT).show();
}
})
.setNegativeButton("No",null)
.show();
}
*/
}
显示结果
第二种:直接创建
布局文件同第一种
java文件
package com.hala.view01;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.icu.util.Calendar;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.IdRes;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hala);
}
public void click(View v){
//这里借助了构建器的create()方法
AlertDialog dialog=new AlertDialog.Builder(this).create();
//这里返回类型是void,所以不能简写
dialog.setTitle("Emilia Clarke");
//设置内容
dialog.setMessage("Do you like Emilia Clarke?");
//设置按钮,第一个参数是按钮类型,第二个参数是文本,第三个参数是按钮摆放在哪里以及点击后的反应
dialog.setButton(DialogInterface.BUTTON_POSITIVE,"Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//退出程序
MainActivity.this.finish();
}
});
dialog.setButton(DialogInterface.BUTTON_NEUTRAL,"just soso", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "hahahha", Toast.LENGTH_SHORT).show();
}
});
//这里不能传null,可以什么都不写
dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
//注意这里show()方法中就包括了create()方法,所以这里不用先create()
dialog.show();
}
}
列表对话框ListDialog
package com.hala.view01;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.icu.util.Calendar;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.IdRes;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hala);
}
public void click(View v) {
final String[] items={"Yes","No","Just soso"};
AlertDialog.Builder dialog=new AlertDialog.Builder(this);
dialog.setTitle("Emilia Clarke")
//设置选项
.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//which代表列表内容的索引
Toast.makeText(MainActivity.this, items[which], Toast.LENGTH_SHORT).show();
}
})
.show();
}
}
显示结果
单选对话框SingleDialog
package com.hala.view01;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.icu.util.Calendar;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.IdRes;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hala);
}
int i=0;
public void click(View v) {
final String[] items={"梅西","C罗","内马尔"};
AlertDialog.Builder dialog=new AlertDialog.Builder(this);
dialog.setTitle("选择你喜欢的球星")
//参数1:选项
//参数2:默认选项的索引
//参数3:被选中后的事件
//这里没有的话可以写null
.setSingleChoiceItems(items, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//i的作用是记下每次点击的索引,以便下边操作
i=which;
}
})
//这里的作用是点击后确定选择让对话框消失
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "我喜欢"+items[i], Toast.LENGTH_SHORT).show();
}
})
.show();
}
}
显示结果
多选对话框MultiDialog
package com.hala.view01;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.icu.util.Calendar;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.IdRes;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hala);
}
int i=0;
public void click(View v) {
final String[] items={"梅西","C罗","内马尔"};
final boolean[] checked={false,false,false};
AlertDialog.Builder dialog=new AlertDialog.Builder(this);
dialog.setTitle("你喜欢哪个球星?")
//参数1:选项
//参数2:是否被选中
//参数3:被点击的触发事件
.setMultiChoiceItems(items, checked, new DialogInterface.OnMultiChoiceClickListener() {
//注意这里不管是选中还是取消选中,都会触发onClick方法
//而checked数组的作用就是记录谁被选中了
//参数一:对话框本身
//参数二:按钮的索引
//参数三:点击后,按钮是否被选中true或者false
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
//这里onClick其实是默认做了下边一个语句,所以我们可以不写
// checked[which]=isChecked;
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String msg="我喜欢:";
for (int i=0;i<checked.length;i++){
if(checked[i])
msg+=items[i]+" ";
}
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
})
.show();
}
}
显示结果
输入对话框InputDialog
package com.hala.view01;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hala);
}
public void click(View v) {
//输入对话框主要是EditText和setView
final EditText edt=new EditText(this);
AlertDialog.Builder dialog=new AlertDialog.Builder(this);
dialog.setTitle("请输入")
.setView(edt)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, edt.getText(), Toast.LENGTH_SHORT).show();
}
})
.show();
}
}
显示结果
等待对话框WaitingDialog
package com.hala.view01;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hala);
}
public void click(View v) {
ProgressDialog dialog=new ProgressDialog(this);
dialog.setTitle("等待对话框");
dialog.setMessage("请等待");
//Canceable默认为true,
//true-点击返回键对话框消失
//false-对话框不会消失,直到进度完成
dialog.setCancelable(true);
dialog.show();
}
}
显示结果
⚠️等待对话框的这种写法已经被谷歌更高版本取消。
进度条对话框ProgressDialog
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hala);
}
public void click(View v) {
final ProgressDialog dialog=new ProgressDialog(this);
dialog.setTitle("下载中");
dialog.setMessage("请等待");
//此句的作用是设置对话框进度为水平样式
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//如果设置为true,进度条会动,但不知道到哪去了
dialog.setIndeterminate(false);
dialog.show();
//让进度条动起来要用一个线程
new Thread(){
@Override
public void run() {
super.run();
for(int i=0,j=0;i<=100;i++,j+=2){
//设置进度条和次进度条
dialog.setProgress(i);
dialog.setSecondaryProgress(j);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//进度完成后让对话框自动消失
dialog.dismiss();
}
}.start();
}
}
显示结果
⚠️ProgressDialog在最新版本已经不使用
自定义对话框Dialog
activity_main.xml文件
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.hala.view01.MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="8dp"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp"
android:text="点我呀"
android:onClick="click"/>
</android.support.constraint.ConstraintLayout>
MainActivity.java文件
package com.hala.view01;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v){
MyDialog dialog=new MyDialog(this);
dialog.show();
}
}
activity_hala.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="300dp"
android:orientation="vertical"
android:background="#ff44ffff">
<TextView
android:layout_width="match_parent"
android:layout_height="150dp"
android:text="你确定要退出程序吗?"
android:gravity="center"
android:textSize="30sp"
android:textColor="#000000"/>
<TextView
android:layout_width="match_parent"
android:layout_height="5dp"
android:background="#ffffff"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="150dp">
<Button
android:id="@+id/bt1"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_gravity="center_vertical"
android:gravity="center"
android:background="#ffffff"
android:text="Yes"
android:layout_weight="1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_gravity="center_vertical"
android:layout_weight="1"/>
<Button
android:id="@+id/bt2"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:layout_gravity="center_vertical"
android:gravity="center"
android:background="#ffffff"
android:text="No"
android:layout_weight="1"/>
</LinearLayout>
</LinearLayout>
MyDialog.java文件
package com.hala.view01;
import android.app.Dialog;
import android.content.Context;
import android.support.annotation.NonNull;
import android.view.View;
import android.widget.Button;
/**
* Created by air on 2018/1/26.
*/
/*
1.自定义一个类,继承于Dialog类(这确保了layout文件是以dialog形式出现的),在构造方法中调用setContentView()来设定对话框布局,这个布局也是自定义的
2.在values的styles.xml中自定义对话框的风格(不显示标题栏 不现实背景)
注意这里可以调用含两个参数(环境,风格)的构造函数,也可以调用含一个参数的构造函数,但改写super,如下
注意这里有简便方法,即完全将第二步去掉,新版的android默认运用你设定好的风格,这里只是为了演示多种方法
3.在自定义类中对自定义对话框的某些控件添加事件
4.在MainActivity中实例化自定义的对话框并显示
*/
public class MyDialog extends Dialog {
Button bt1,bt2;
public MyDialog(@NonNull Context context) {
super(context,R.style.mydialog);
//设定对话框的布局
setContentView(R.layout.activity_hala);
bt1=(Button) findViewById(R.id.bt1);
bt2=(Button)findViewById(R.id.bt2);
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//退出整个程序
System.exit(0);
}
});
bt2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//控制对话框消失,注意它本身就写在MaDialog里,所以可以直接调用
dismiss();
}
});
}
}
styles.xml文件
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<!--parent是指继承标准对话框-->
<!--windowNoTitle是没有标题栏-->
<!--background设置为transparent意为透明-->
<style name="mydialog"
parent="android:style/Theme.Dialog">
<item name="android:windowNoTitle">true</item>
<item name="android:background">@android:color/transparent</item>
</style>
</resources>
适配器的运用ArrayDialog
适配器主要用于制作更加复杂的对话框样式,比如带有图标的
每个选项的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:src="@mipmap/ic_launcher"/>
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="哈哈1"/>
</LinearLayout>
java文件
package com.hala.view01;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.icu.util.Calendar;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.IdRes;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v) {
final String[] items={"Yes","No","Just soso"};
/*
数组适配器
参数1:环境
参数2:布局资源索引,指的是每项数据所呈现样式(需要自己设计)
注意这里也可以引用android自带的,这样就不需要参数3了
参数3:因为文字数组必须是在TextView内,所以要指定出你要放入参数2设定布局的哪一个TextView里
参数4:引入的文本资源,可以是集合或数组
*/
ArrayAdapter adapter=new ArrayAdapter(this,R.layout.activity_hala,R.id.tv,items);
AlertDialog.Builder dialog=new AlertDialog.Builder(this);
dialog.setTitle("Emilia Clarke")
//参数一:适配器对象(对数据显示样式的规则制定器)
//参数二:监听器。可以设置为null,也可以设置点击后事件
.setAdapter(adapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this,items[which], Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
})
.show();
}
}
显示结果