Androidstudio复习弹窗对话框(Popupwindow)、日期对话框(DataPickerDialog)、
时间对话框(TimePickerDialog)制作综合小demo
一、最终效果演示:
二、布局设计
1、首页界面设计Activity_main.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:app="http://schemas.android.com/apk/res-auto"
4 xmlns:tools="http://schemas.android.com/tools"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"
7 android:orientation="vertical"
8 tools:context=".MainActivity" >
9
10 <Button
11 android:id="@+id/btn_1"
12 android:layout_width="match_parent"
13 android:layout_height="wrap_content"
14 android:onClick="MyClick"
15 android:text="对话框" />
16
17 <Button
18 android:id="@+id/btn_2"
19 android:layout_width="match_parent"
20 android:layout_height="wrap_content"
21 android:text="自定义对话框"
22 android:onClick="MyClick"
23 />
24
25 <Button
26 android:id="@+id/btn_3"
27 android:layout_width="match_parent"
28 android:layout_height="wrap_content"
29 android:text="弹窗popupwindow" />
30
31 <RadioGroup
32 android:layout_width="match_parent"
33 android:layout_height="match_parent" >
34
35 <Button
36 android:id="@+id/btn_4"
37 android:layout_width="match_parent"
38 android:layout_height="wrap_content"
39 android:text="日期对话框" />
40
41 <Button
42 android:id="@+id/btn_5"
43 android:layout_width="match_parent"
44 android:layout_height="wrap_content"
45 android:text="时间对话框" />
46 </RadioGroup>
47 </LinearLayout>
2、自定义对话框布局设计Dialog_main.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 <androidx.constraintlayout.widget.ConstraintLayout
3 xmlns:android="http://schemas.android.com/apk/res/android"
4 xmlns:app="http://schemas.android.com/apk/res-auto"
5 xmlns:tools="http://schemas.android.com/tools"
6 android:layout_width="match_parent"
7 android:layout_height="wrap_content"
8 android:layout_gravity="center_horizontal"
9 android:background="@drawable/dialog_bg">
10
11 <TextView
12 android:id="@+id/textView"
13 android:layout_width="wrap_content"
14 android:layout_height="wrap_content"
15 android:layout_marginTop="356dp"
16 android:text="您确定要退出吗?"
17 android:textColor="#EF0A0A"
18 android:textSize="40sp"
19 android:textStyle="bold"
20 app:layout_constraintEnd_toEndOf="parent"
21 app:layout_constraintHorizontal_bias="0.62"
22 app:layout_constraintStart_toStartOf="parent"
23 app:layout_constraintTop_toTopOf="parent" />
24
25 <LinearLayout
26 android:layout_width="409dp"
27 android:layout_height="184dp"
28 android:orientation="horizontal"
29 app:layout_constraintBottom_toBottomOf="parent"
30 app:layout_constraintEnd_toEndOf="parent"
31 app:layout_constraintHorizontal_bias="0.487"
32 app:layout_constraintStart_toStartOf="parent"
33 app:layout_constraintTop_toBottomOf="@+id/textView"
34 android:gravity="center_vertical"
35 app:layout_constraintVertical_bias="0.251">
36
37 <Button
38 android:id="@+id/yesbutton"
39 android:layout_width="80dp"
40 android:layout_height="50dp"
41 android:layout_weight="1"
42 android:layout_marginLeft="40dp"
43 android:background="@drawable/yes_btn" />
44
45 <Button
46 android:id="@+id/nobutton"
47 android:layout_width="80dp"
48 android:layout_height="50dp"
49 android:layout_marginRight="40dp"
50 android:layout_marginLeft="20dp"
51 android:layout_weight="1"
52 android:background="@drawable/no_btn" />
53 </LinearLayout>
54 </androidx.constraintlayout.widget.ConstraintLayout>
3、弹窗自定义布局设计 popupwindow.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:app="http://schemas.android.com/apk/res-auto"
4 xmlns:tools="http://schemas.android.com/tools"
5 android:layout_width="match_parent"
6 android:layout_height="match_parent"
7 android:onClick="xz">
8
9
10 <Button
11 android:id="@+id/option"
12 android:layout_width="50dp"
13 android:layout_height="wrap_content"
14 android:background="#000000"
15 android:onClick="xz"
16 android:text="选择"
17 android:textColor="#ffffff"
18 android:textStyle="bold"
19 app:layout_constraintStart_toStartOf="parent"
20 app:layout_constraintTop_toTopOf="parent" />
21
22 <Button
23 android:id="@+id/copy"
24 android:layout_width="50dp"
25 android:layout_height="wrap_content"
26 android:background="#000000"
27 android:text="复制"
28 android:textColor="#ffffff"
29 android:textStyle="bold"
30 app:layout_constraintStart_toEndOf="@+id/option"
31 app:layout_constraintTop_toTopOf="parent" />
32
33 <Button
34 android:id="@+id/paste"
35 android:layout_width="50dp"
36 android:layout_height="wrap_content"
37 android:background="#000000"
38 android:text="粘贴"
39 android:textColor="#ffffff"
40 android:textStyle="bold"
41 app:layout_constraintStart_toEndOf="@+id/copy"
42 app:layout_constraintTop_toTopOf="parent" />
43 </androidx.constraintlayout.widget.ConstraintLayout>
三、样式设置res/values/style.xml
1 <resources>
2
3 <!-- Base application theme. -->
4 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
5 <!-- Customize your theme here. -->
6 <item name="colorPrimary">@color/colorPrimary</item>
7 <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
8 <item name="colorAccent">@color/colorAccent</item>
9 </style>
10 <!-- 设置自定义对话框样式:①导入对话框样式模板 -->
11 <style name="mydialog" parent="android:style/Theme.Dialog">
12 <item name="android:windowNoTitle">true</item>
13 <!-- 设置关闭自定义对话框标题 -->
14 <item name="android:windowBackground">@android:color/transparent</item>
15 <!-- 设置自定义对话框背景颜色为透明 -->
16 </style>
17
18 </resources>
四、功能实现
1、MainActivity.java
1 package com.example.adf520;
2
3 import androidx.appcompat.app.AlertDialog;
4 import androidx.appcompat.app.AppCompatActivity;
5
6 import android.app.DatePickerDialog;
7 import android.app.DatePickerDialog.OnDateSetListener;
8 import android.app.Dialog;
9 import android.app.TimePickerDialog;
10 import android.content.DialogInterface;
11 import android.graphics.Color;
12 import android.graphics.drawable.ColorDrawable;
13 import android.os.Bundle;
14 import android.view.LayoutInflater;
15 import android.view.View;
16 import android.widget.Button;
17 import android.widget.CheckBox;
18 import android.widget.CompoundButton;
19 import android.widget.DatePicker;
20 import android.widget.LinearLayout;
21 import android.widget.PopupWindow;
22 import android.widget.RadioButton;
23 import android.widget.TimePicker;
24 import android.widget.Toast;
25
26 public class MainActivity extends AppCompatActivity implements View.OnClickListener {
27 Button btn_1,btn_2,btn_3,btn_4,btn_5;//声明对话框按钮、自定义对话框
28
29
30 @Override
31 protected void onCreate(Bundle savedInstanceState) {
32 super.onCreate(savedInstanceState);
33 setContentView(R.layout.activity_main);
34 btn_1=findViewById(R.id.btn_1);//寻找对话框按钮ID
35 btn_2=findViewById(R.id.btn_2);//寻找自定义对话框按钮ID
36 btn_3=findViewById(R.id.btn_3);//寻找弹窗按钮ID
37 btn_4=findViewById(R.id.btn_4);//寻找日期对话框按钮ID
38 btn_5=findViewById(R.id.btn_5);//寻找时间对话框按钮ID
39
40 btn_1.setOnClickListener(this);//对话框按钮建立监听器
41 btn_2.setOnClickListener(this);//自定义对话框按钮建立监听器
42 btn_3.setOnClickListener(this);//弹窗按钮建立监听器
43 btn_4.setOnClickListener(this);//日期对话框按钮建立监听器
44 btn_5.setOnClickListener(this);//时间对话框按钮建立监听器
45
46
47
48
49 }
50 //实现按钮交互功能
51 @Override
52 public void onClick(View v) {
53 switch (v.getId()){ //通过多分支选择判断:当选中对话框时,执行对话框按钮
54 //①对话框响应事件
55 case R.id.btn_1:
56 AlertDialog.Builder builder=new AlertDialog.Builder(this);//AlertDialog创建一个Builder实例化建立器
57 //通过builder实例化建立器来调用对话框属性:
58 builder.setTitle("提示"); //设置对话框标题
59 builder.setMessage("您是否退出?");//设置对话框信息提示
60 builder.setNegativeButton("NO",null);//对话框信息提示,选择取消
61 builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
62 //对话框信息提示,选项按钮,选择"YES"将执行DialogInterface监听器里面方法,执行退出
63 @Override
64 public void onClick(DialogInterface dialog, int which) {
65 finish();
66 }
67 });
68 builder.show();//对话框展示
69 break;
70
71
72
73 //通过多分支选择判断:当选中对话框时,执行自定义对话框按钮
74 case R.id.btn_2:
75 mydialog mydialog=new mydialog(this,R.style.mydialog);
76 //实例化mydialog设置参数( 参数1:环境上下文 (这里设置this), 参数2:导入样式R.style/样式名)
77 mydialog.show();//展示效果
78 break;
79
80
81 //弹窗响应事件
82 case R.id.btn_3:
83 showPopupWindow(v);
84 break;
85 //日期对话框响应事件
86 case R.id.btn_4:
87 /**
88 * 参数1:上下文
89 * 参数2:日期设置监听器
90 * 参数3-5:默认显示的年、月、日
91 */
92 DatePickerDialog datePickerDialog=new DatePickerDialog(MainActivity.this, new OnDateSetListener() {
93 @Override
94 public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
95 Toast.makeText(MainActivity.this, "您当前选择日期:"+year+"年"+(month+1)+"月"+dayOfMonth+"日", Toast.LENGTH_SHORT).show();
96 }
97 }, 2020, 3, 30);
98 datePickerDialog.show();//展示日期对话框
99 break;
100 //时间对话框响应事件
101 case R.id.btn_5:
102 /**
103 * 参数1:上下文
104 * 参数2:日期设置监听器
105 * 参数3-5:默认显示的小时、分钟、是否设置为24进制
106 */
107 TimePickerDialog timePickerDialog=new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() {
108 @Override
109 public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
110 Toast.makeText(MainActivity.this, "您当前选择时间:"+hourOfDay+":"+minute, Toast.LENGTH_SHORT).show();
111 }
112 }, 12, 33, true);
113 timePickerDialog.show();//展示时间对话框
114 break;
115 }
116 }
117 //设置popupWindows方法
118 public void showPopupWindow(View view) {
119 //1、准备弹窗需要的视图对象(通过View孵化类来加载弹窗布局)
120 View v= LayoutInflater.from(this).inflate(R.layout.popupwindow,null);
121
122 ///2、实例化对象popupwindow
123 //参数1:用在弹窗中的View
124 //参数2、3:弹窗的宽高
125 //参数4(focusable),是否获取焦点
126 final PopupWindow popupWindow=new PopupWindow(v,500,80,true);
127
128 //3、设置背景、动画
129 //设置背景
130 popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
131 //设置能响应外部的点击事件
132 popupWindow.setOutsideTouchable(true);
133 //设置能响应点击事件
134 popupWindow.setTouchable(true);
135
136
137
138
139
140 //4、显示
141 //参数1(anchor):锚
142 //参数2 、 3:相对于锚在x 、 y方向上的偏移量
143 popupWindow.showAsDropDown(view,1000,50);
144
145 //给弹出设置响应事件
146 v.findViewById(R.id.option).setOnClickListener(new View.OnClickListener() {
147 @Override
148 public void onClick(View v) {
149 Toast.makeText(MainActivity.this, "选择", Toast.LENGTH_SHORT).show();
150 popupWindow.dismiss();//弹窗消失
151 }
152 });
153 v.findViewById(R.id.copy).setOnClickListener(new View.OnClickListener() {
154 @Override
155 public void onClick(View v) {
156 Toast.makeText(MainActivity.this, "复制", Toast.LENGTH_SHORT).show();
157 popupWindow.dismiss();//弹窗消失
158 }
159 });
160 v.findViewById(R.id.paste).setOnClickListener(new View.OnClickListener() {
161 @Override
162 public void onClick(View v) {
163 Toast.makeText(MainActivity.this, "粘贴", Toast.LENGTH_SHORT).show();
164 popupWindow.dismiss();//弹窗消失
165 }
166 });
167
168 }
169
170
171
172
173 // 上下文菜单普通方法
174 public void show(){
175 AlertDialog dialog=new AlertDialog.Builder(this).create();
176 dialog.setTitle("提示");
177 dialog.setMessage("您确定要退出吗?");
178 dialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() {
179 @Override
180 public void onClick(DialogInterface dialog, int which) {
181
182 }
183 });
184 dialog.show();
185 }
186
187
188
189
190
191
192 }
2、mydialog.java自定义对话框
1 package com.example.adf520;
2
3 import android.app.Dialog;
4 import android.content.Context;
5 import android.view.View;
6
7 import androidx.annotation.NonNull;
8
9 public class mydialog extends Dialog {
10
11 public mydialog(@NonNull Context context, int themeResId) {
12 super(context, themeResId);
13 setContentView(R.layout.dialog_main);//输出自定义对话框布局
14
15 /**总结自定义对话框步骤:
16 * ①设计自定义对话框布局样式--》dialog_layout.xml
17 * ②设计style文件(关闭自定义对话框的标题、去除背景(把背景设置成透明色))
18 *③ 将第一步的布局应用到当前自定义对话框(mydialog.java中设置,另外也要实现YES按钮和NO按钮的响应功能)
19 * ④在MainActivity.java实例化对话框(参数1:环境上下文(默认设置:this),参数2:导入样式R.style/样式名 ;并且show()方法展示出对话框效果)
20 */
21
22
23
24
25 //YES按钮安装监听器,实现响应功能
26 findViewById(R.id.yesbutton).setOnClickListener(new View.OnClickListener() {
27 @Override
28 public void onClick(View v) {
29 System.exit(0); //自定义对话框点击YES按钮时,执行退出
30 }
31 });
32 //NO按钮安装监听器,实现响应功能
33 findViewById(R.id.nobutton).setOnClickListener(new View.OnClickListener() {
34 @Override
35 public void onClick(View v) {
36 dismiss(); //自定义对话框点击NO按钮时,取消
37 }
38 });
39 }
40 }