Android对话框
消息提示机制,常用于向用户传递信息、提示或警告用户的行为。通用的方法有setTitle、setMessage、create、show。本片文章主要是简单对话框的使用,如何自定义对话框,如何使用PopupWindow进行弹框,以及如何对PopupWindow弹框加上动画效果。
简单对话框
1<Button
2 android:id="@+id/normal_dialog_btn"
3 android:text="普通对话框"
4 android:onClick="myClick"
5 android:layout_width="match_parent"
6 android:layout_height="wrap_content"/>
7
8<Button
9 android:id="@+id/diy_dialog_btn"
10 android:text="自定义对话框"
11 android:onClick="myClick"
12 android:layout_width="match_parent"
13 android:layout_height="wrap_content"/>
其实普通对话框比较简单:
1public void myClick(View view) {
2 switch (view.getId()){
3 case R.id.normal_dialog_btn:
4 // AlertDialog
5 AlertDialog.Builder builder = new AlertDialog.Builder(this);
6 builder.setTitle("提示");
7 builder.setMessage("确定退出程序吗?");
8 builder.setPositiveButton("确定", (dialog, which) -> finish());
9 builder.setNegativeButton("取消", null);
10 builder.show();
11 break;
12 case R.id.diy_dialog_btn:
13 break;
14 }
15}
不过也可以通过自定义方法进行Dialog的新建:
1// 自定义方法
2private void showNormalDialog(){
3 AlertDialog alertDialog = new AlertDialog.Builder(this).create();
4 alertDialog.setTitle("提示");
5 alertDialog.setMessage("确定退出程序吗?");
6 alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() {
7 @Override
8 public void onClick(DialogInterface dialog, int which) {
9 finish();
10 }
11 });
12 alertDialog.show();
13}
自定义对话框
步骤:设置布局 > 设置Style > 自定义Dialog > 显示Dialog
下面通过这几个素材来完成一个非常可爱的自定义对话框:
首先新建一个diy_dialog.xml,在该布局文件中描述我们对话框的布局:
1<?xml version="1.0" encoding="utf-8"?>
2<LinearLayout
3 xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
4 android:orientation="vertical"
5 android:gravity="center_horizontal"
6 android:background="@mipmap/dialog_bg"
7 android:padding="20dp"
8 android:layout_height="match_parent">
9
10 <TextView
11 android:layout_width="wrap_content"
12 android:layout_height="wrap_content"
13 android:text="你确定要退出吗?"
14 android:textColor="#ff0000"
15 android:textSize="35dp"
16 android:layout_marginTop="260dp"
17 android:textStyle="bold" />
18 <LinearLayout
19 android:orientation="horizontal"
20 android:layout_width="wrap_content"
21 android:layout_marginTop="20dp"
22 android:layout_height="wrap_content">
23 <Button
24 android:id="@+id/no_btn"
25 android:layout_width="120dp"
26 android:layout_height="50dp"
27 android:background="@mipmap/no_btn"/>
28 <Button
29 android:id="@+id/yes_btn"
30 android:layout_width="120dp"
31 android:layout_marginStart="20dp"
32 android:layout_height="50dp"
33 android:background="@mipmap/yes_btn"/>
34 </LinearLayout>
35</LinearLayout>
为了去除原始Dialog中的标题和默认背景色,定义一个style,命名为DiyDialog:
1<style name="DiyDialog" parent="android:style/Theme.Dialog">
2 <!--背景颜色及和透明程度-->
3 <item name="android:windowBackground">@android:color/transparent</item>
4 <!--是否去除标题 -->
5 <item name="android:windowNoTitle">true</item>
6</style>
接下来写一个自定义类DiyDialog继承Dialog,注意覆写构造方法:
1public class DiyDialog extends Dialog {
2 public DiyDialog(@NonNull Context context, int themeResId) {
3 super(context, themeResId);
4 // 为对话框设置布局
5 setContentView(R.layout.diy_dialog);
6
7 // 按钮添加点击事件
8 findViewById(R.id.no_btn).setOnClickListener((e)->{
9 this.dismiss();
10 });
11
12 findViewById(R.id.yes_btn).setOnClickListener((e)->{
13 System.exit(0);
14 });
15 }
16}
上面为了能够使用自定义的style,所以选择了带themeResId的构造函数。
接下来在按钮的点击事件中使用即可,在构造DiyDialog时,注意需要把定义的style资源ID传给它:
PopupWindow
PopUpWindow 的使用场景很多,因为它能在任意位置弹出, 这是其他方式很难做到的。 从 Google的开发文档中我们不难看出,首先它是一个 Window,弹出时位于其他控件的上层。PopupWindow使用步骤:
1、创建PopupWindow对象实例 2、设置背景、注册事件监听器和添加动画 3、显示PopupWindow
首先按钮的点击事件写为showPopupWindow(View view),点击按钮时弹出PopupWindow。
先写布局文件如下 popup_window.xml,其实就是三个按钮
1<?xml version="1.0" encoding="utf-8"?>
2<LinearLayout
3 xmlns:android="http://schemas.android.com/apk/res/android"
4 android:orientation="horizontal"
5 android:padding="2dp"
6 android:background="#00ffff"
7 android:layout_width="wrap_content"
8 android:layout_height="wrap_content">
9
10 <TextView
11 android:id="@+id/chose_btn"
12 android:layout_width="60dp"
13 android:layout_height="30dp"
14 android:gravity="center"
15 android:textColor="#ffffff"
16 android:background="#000000"
17 android:text="选择"/>
18 <TextView
19 android:id="@+id/chose_all_btn"
20 android:layout_width="60dp"
21 android:layout_height="30dp"
22 android:textColor="#ffffff"
23 android:gravity="center"
24 android:background="#000000"
25 android:text="全选"/>
26 <TextView
27 android:id="@+id/copy_btn"
28 android:layout_width="60dp"
29 android:layout_height="30dp"
30 android:textColor="#ffffff"
31 android:gravity="center"
32 android:background="#000000"
33 android:text="复制"/>
34</LinearLayout>
然后实例化并显示PopupWindow即可:
1private void showPopupWindow(View v) {
2 // 实例化
3 View view = LayoutInflater.from(this).inflate(R.layout.popup_window, null);
4 // view 宽高 是否获得焦点
5 PopupWindow window = new PopupWindow(view, 360, 65, true);
6 // 设置背景为透明
7 window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
8 // 设置可以响应外部的点击事件
9 window.setOutsideTouchable(true);
10 // 设置自身可以响应点击事件
11 window.setTouchable(true);
12 // 设置动画(1.创建动画资源 2.创建一个style应用动画资源 3.当前弹窗的动画风格设置)
13 window.setAnimationStyle(R.style.translate_anim);
14 // 以view为参照物
15 window.showAsDropDown(v);
16 // 设置按钮的点击事件监听
17 view.findViewById(R.id.chose_btn).setOnClickListener((e)->{
18 Toast.makeText(MainActivity.this, "选择", Toast.LENGTH_SHORT).show();
19 // 不要忘记关闭PopupWindow
20 window.dismiss();
21 });
22
23 view.findViewById(R.id.chose_all_btn).setOnClickListener((e)->{
24 Toast.makeText(MainActivity.this, "全选", Toast.LENGTH_SHORT).show();
25 window.dismiss();
26 });
27
28 view.findViewById(R.id.copy_btn).setOnClickListener((e)->{
29 Toast.makeText(MainActivity.this, "复制", Toast.LENGTH_SHORT).show();
30 window.dismiss();
31 });
32}
设置动画应该如何设置呢?1、创建动画资源 2、创建一个style应用动画资源 3、当前弹窗的动画风格设置
先在res目录下新建anim目录:
新建一个只包含了平移动画的动画资源文件translate.xml
1<?xml version="1.0" encoding="utf-8"?>
2<set xmlns:android="http://schemas.android.com/apk/res/android">
3 <translate
4 android:fromXDelta="0"
5 android:toXDelta="0"
6 android:fromYDelta="200"
7 android:toYDelta="0"
8 >
9 </translate>
10</set>
创建一个style应用该动画资源:
1<!-- 应用动画资源 -->
2<style name="translate_anim">
3 <item name="android:windowEnterAnimation">@anim/translate</item>
4</style>
然后在代码中使用即可: