大部分来自网上,这边做个总结和记录!
结果gif
目录
1.对话框部分
2.PopupWindow部分
3.全部代码
1.对话框部分
首先把整个布局贴出来
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.gjn.dialogdemo.MainActivity">
<Button
android:text="单选对话框"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_list"
android:layout_alignStart="@+id/btn_list"
android:id="@+id/btn_radio" />
<Button
android:text="多选对话框"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_radio"
android:layout_alignStart="@+id/btn_radio"
android:id="@+id/btn_checkbox" />
<Button
android:text="圆形进度对话框"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_checkbox"
android:layout_alignStart="@+id/btn_checkbox"
android:id="@+id/btn_wait" />
<Button
android:text="进度对话框"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_wait"
android:layout_alignStart="@+id/btn_wait"
android:id="@+id/btn_progress" />
<Button
android:text="自定义对话框"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_progress"
android:layout_alignStart="@+id/btn_progress"
android:id="@+id/btn_view" />
<Button
android:text="列表对话框"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_list"
android:layout_below="@+id/btn_normal"
android:layout_alignStart="@+id/btn_normal" />
<Button
android:text="普通对话框"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_normal"
android:layout_alignParentTop="true"
android:layout_alignParentStart="true" />
<Button
android:text="Popup_up"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="15dp"
android:id="@+id/btn_up"
android:layout_alignParentBottom="true"
android:layout_alignStart="@+id/btn_center" />
<Button
android:text="Popup_down"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_down"
android:layout_marginEnd="24dp"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true" />
<Button
android:text="Popop_center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_center"
android:layout_alignBaseline="@+id/btn_wait"
android:layout_alignBottom="@+id/btn_wait"
android:layout_alignStart="@+id/btn_down" />
</RelativeLayout>
1.1最普通的对话框
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("标题")
.setIcon(R.mipmap.ic_launcher);
builder.setMessage("信息")
.setNegativeButton("按钮1/关闭", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showTip("which:" + which);
}
})
.setNeutralButton("按钮2/否", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showTip("which:" + which);
}
})
.setPositiveButton("按钮3/是", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showTip("which:" + which);
}
}).show();
1.2列表对话框
private String[] items = {"android","ios","html5"};
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("标题")
.setIcon(R.mipmap.ic_launcher);
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showTip("点击"+items[which]);
}
}).show();
1.3单选对话框
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("标题")
.setIcon(R.mipmap.ic_launcher);
choice = -1;
builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
choice = which;
}
}).setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (choice != -1){
showTip(items[choice]+"被选中");
}else{
showTip("未选中任何选项");
}
}
}).show();
1.4多选对话框
private List<String> choices = new ArrayList<>();
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("标题")
.setIcon(R.mipmap.ic_launcher);
choices.clear();
builder.setMultiChoiceItems(items, null, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if (isChecked){
choices.add(items[which]);
}else{
choices.remove(items[which]);
}
}
}).setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (choices.size() > 0){
StringBuffer sb = new StringBuffer();
for (String s : choices) {
sb.append(s+"\n");
}
showTip(sb.toString()+"被选中");
}else{
showTip("未选中任何选项");
}
}
}).show();
1.5自定义对话框
需要设置自定义界面
自定义布局
dialogview.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="match_parent"
android:orientation="vertical">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp">
<TextView
android:text="用户名:"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:ems="10"
android:id="@+id/et_name"
android:layout_weight="1"
android:hint="请输入账号" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp">
<TextView
android:text=" 密 码:"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="textPassword"
android:ems="10"
android:id="@+id/et_pwd"
android:layout_weight="1"
android:hint="请输入密码" />
</LinearLayout>
</LinearLayout>
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("标题")
.setIcon(R.mipmap.ic_launcher);
View view = LayoutInflater.from(MainActivity.this)
.inflate(R.layout.dialogview,null,false);
final EditText et1 = (EditText) view.findViewById(R.id.et_name);
final EditText et2 = (EditText) view.findViewById(R.id.et_pwd);
builder.setView(view)
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setPositiveButton("登陆", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showTip(et1.getText().toString()+","+et2.getText().toString());
}
})
.show();
1.6等待对话框
final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setTitle("标题");
progressDialog.setIcon(R.mipmap.ic_launcher);
progressDialog.setMessage("信息");
//设置允许动画
progressDialog.setIndeterminate(true);
//不允许点击对话框外dismiss对话框
progressDialog.setCancelable(false);
progressDialog.show();
new Thread(new Runnable() {
@Override
public void run() {
int p = 0;
while (p<100){
try {
Thread.sleep(50);
p++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
progressDialog.cancel();
runOnUiThread(new Runnable() {
@Override
public void run() {
showTip("加载完毕");
}
});
}
}).start();
1.7进度对话框
final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setTitle("标题");
progressDialog.setIcon(R.mipmap.ic_launcher);
progressDialog.setMessage("信息");
progressDialog.setProgress(0);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMax(100);
progressDialog.show();
new Thread(new Runnable() {
@Override
public void run() {
int p = 0;
while (p<100){
try {
Thread.sleep(50);
p++;
progressDialog.setProgress(p);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
progressDialog.cancel();
runOnUiThread(new Runnable() {
@Override
public void run() {
showTip("百分之百下载完毕");
}
});
}
}).start();
2.PopupWindow部分
首先也设置一下弹出框的布局
popupwindow.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:background="@android:color/holo_blue_dark">
<TextView
android:text="测试测试"
android:textStyle="normal|bold"
android:textAlignment="center"
android:layout_width="wrap_content"
android:textSize="20sp"
android:layout_height="wrap_content" />
<Button
android:text="Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_dj" />
</LinearLayout>
再来看实现代码
View view = LayoutInflater.from(this).inflate(R.layout.popupwindow,null,false);
final PopupWindow popupWindow = new PopupWindow(view, 200, 100,true);
Button button = (Button) view.findViewById(R.id.btn_dj);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showTip("点击");
popupWindow.dismiss();
}
});
//允许触摸
// popupWindow.setTouchable(true);
//设置背景 解决点击返回和点击popupwindow外弹出框不消失问题
popupWindow.setBackgroundDrawable(new ColorDrawable());
switch(type){
case 1:
popupWindow.showAsDropDown(btn8);
break;
case 2:
popupWindow.showAtLocation(btn9,Gravity.CENTER,0,0);
break;
case 3:
int height = -popupWindow.getHeight()-btn10.getHeight()-20;
popupWindow.showAsDropDown(btn10,0,height);
break;
}
实现很简单,就是先将布局关联,然后设置宽高和点击事件就完成了!
1.直接使用showAsDropDown不设任何参数就是默认在点击按钮的下方出现
2.showAtLocation有4个参数 其中第一个view容易让人误解,以为是要放点击控件的父控件,其实这并不是父控件,而是只要在父控件下的任意一个子控件就行了
具体说明可以看这篇文档 Android PopupWindow 的显示位置
3.全部代码
MainActivity.java
package com.gjn.dialogdemo;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.PopupWindow;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn1, btn2, btn3, btn4, btn5, btn6, btn7,btn8,btn9,btn10;
private String[] items = {"android","ios","html5"};
private int choice;
private List<String> choices = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initview();
initclcik();
}
private void initclcik() {
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
btn4.setOnClickListener(this);
btn5.setOnClickListener(this);
btn6.setOnClickListener(this);
btn7.setOnClickListener(this);
btn8.setOnClickListener(this);
btn9.setOnClickListener(this);
btn10.setOnClickListener(this);
}
private void initview() {
btn1 = (Button) findViewById(R.id.btn_normal);
btn2 = (Button) findViewById(R.id.btn_list);
btn3 = (Button) findViewById(R.id.btn_radio);
btn4 = (Button) findViewById(R.id.btn_checkbox);
btn5 = (Button) findViewById(R.id.btn_wait);
btn6 = (Button) findViewById(R.id.btn_progress);
btn7 = (Button) findViewById(R.id.btn_view);
btn8 = (Button) findViewById(R.id.btn_down);
btn9 = (Button) findViewById(R.id.btn_center);
btn10 = (Button) findViewById(R.id.btn_up);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_normal:
showMyDialog(1);
break;
case R.id.btn_list:
showMyDialog(2);
break;
case R.id.btn_radio:
showMyDialog(3);
break;
case R.id.btn_checkbox:
showMyDialog(4);
break;
case R.id.btn_wait:
showMyDialog(5);
break;
case R.id.btn_progress:
showMyDialog(6);
break;
case R.id.btn_view:
showMyDialog(7);
break;
case R.id.btn_down:
showPopupWindow(1);
break;
case R.id.btn_center:
showPopupWindow(2);
break;
case R.id.btn_up:
showPopupWindow(3);
break;
}
}
private void showPopupWindow(int type) {
View view = LayoutInflater.from(this).inflate(R.layout.popupwindow,null,false);
final PopupWindow popupWindow = new PopupWindow(view, 200, 100,true);
Button button = (Button) view.findViewById(R.id.btn_dj);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showTip("点击");
popupWindow.dismiss();
}
});
//允许触摸
// popupWindow.setTouchable(true);
//设置背景 解决点击返回和点击popupwindow外弹出框不消失问题
popupWindow.setBackgroundDrawable(new ColorDrawable());
switch(type){
case 1:
popupWindow.showAsDropDown(btn8);
break;
case 2:
popupWindow.showAtLocation(btn9,Gravity.CENTER,0,0);
break;
case 3:
int height = -popupWindow.getHeight()-btn10.getHeight()-20;
popupWindow.showAsDropDown(btn10,0,height);
break;
}
}
private void showMyDialog(int type) {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("标题")
.setIcon(R.mipmap.ic_launcher);
final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setTitle("标题");
progressDialog.setIcon(R.mipmap.ic_launcher);
progressDialog.setMessage("信息");
switch (type) {
case 1:
builder.setMessage("信息")
.setNegativeButton("按钮1/关闭", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showTip("which:" + which);
}
})
.setNeutralButton("按钮2/否", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showTip("which:" + which);
}
})
.setPositiveButton("按钮3/是", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showTip("which:" + which);
}
}).show();
break;
case 2:
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showTip("点击"+items[which]);
}
}).show();
break;
case 3:
choice = -1;
builder.setSingleChoiceItems(items, -1, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
choice = which;
}
}).setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (choice != -1){
showTip(items[choice]+"被选中");
}else{
showTip("未选中任何选项");
}
}
}).show();
break;
case 4:
choices.clear();
builder.setMultiChoiceItems(items, null, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if (isChecked){
choices.add(items[which]);
}else{
choices.remove(items[which]);
}
}
}).setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (choices.size() > 0){
StringBuffer sb = new StringBuffer();
for (String s : choices) {
sb.append(s+"\n");
}
showTip(sb.toString()+"被选中");
}else{
showTip("未选中任何选项");
}
}
}).show();
break;
case 5:
//设置允许动画
progressDialog.setIndeterminate(true);
//不允许点击对话框外dismiss对话框
progressDialog.setCancelable(false);
progressDialog.show();
new Thread(new Runnable() {
@Override
public void run() {
int p = 0;
while (p<100){
try {
Thread.sleep(50);
p++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
progressDialog.cancel();
runOnUiThread(new Runnable() {
@Override
public void run() {
showTip("加载完毕");
}
});
}
}).start();
break;
case 6:
progressDialog.setProgress(0);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMax(100);
progressDialog.show();
new Thread(new Runnable() {
@Override
public void run() {
int p = 0;
while (p<100){
try {
Thread.sleep(50);
p++;
progressDialog.setProgress(p);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
progressDialog.cancel();
runOnUiThread(new Runnable() {
@Override
public void run() {
showTip("百分之百下载完毕");
}
});
}
}).start();
break;
case 7:
View view = LayoutInflater.from(MainActivity.this)
.inflate(R.layout.dialogview,null,false);
final EditText et1 = (EditText) view.findViewById(R.id.et_name);
final EditText et2 = (EditText) view.findViewById(R.id.et_pwd);
builder.setView(view)
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setPositiveButton("登陆", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
showTip(et1.getText().toString()+","+et2.getText().toString());
}
})
.show();
break;
}
}
private void showTip(String s) {
Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();
}
}
对话框参考文章
popupWindow参考文章
Android PopupWindow怎么合理控制弹出位置(showAtLocation)