Dialog相关
自定义布局的Dialog
基类dialog
1 | import android.app.Activity; |
style.xml中
1 | <!--背景透明的弹窗风格--> |
dialog_enter.xml
1 |
|
dialog_exit.xml
1 |
|
创建自己的dialog
1 | public class FiltrateDataDialog extends BaseDialog{ |
dialog_filtrate.xml
1 |
|
push_in_style.xml
1 |
|
push_out_style.xml
1 |
|
自定义布局的Dialog+选择日期Dialog
效果图
自定义布局弹窗.jpg
选择日期弹窗.jpg
工具
DateOrCityChooseLdy.java 基于WheelView的年月日选择器(城市选择器)
1 | package com.u1city.androidframe.Component.wheelview; |
layout_city_choose_ldy.xml
1 | <?xml version="1.0" encoding="utf-8"?> |
Wheel.java
1 | /* |
调用
dialog_choose_date.xml 这是dialog的布局
1 | <?xml version="1.0" encoding="utf-8"?> |
Activity中调用
1 | private AlertDialog alertDialog; |
带输入框的弹窗
示例图
带输入框的弹窗.jpg
ChangePriceDialog.java
1 | /** |
dialog_change_price.xml
1 | <?xml version="1.0" encoding="utf-8"?> |
在Activity中调用
1 | ChangePriceDialog changePriceDialog = new ChangePriceDialog(this); |
带一个/两个按钮的提示dialog
效果图
带一个确认按钮的dialog.png
带两个按钮的dialog.png
带两个按钮的dialog.png
CommentTipDialog.java
1 | /** |
dialog_alert.xml 带一个按钮的dialog的布局文件
1 |
|
drawable/corner_ff5252.xml
1 |
|
dialog_confirm.xml 带两个按钮的dialog的布局文件
1 |
|
使用
1 | /** |
1 | /** |
Dialog去除边框
先新建一个Style
1 | <!--Dialog样式 没有四周边框--> |
新建一个类继承Dialog
1 | public class OBDPopDialog extends Dialog { |
然后就和一般的Dialog用法一样了(下面代码附带让Dialog出现位置以及展示大小)
1 | final OBDPopDialog dialog = new OBDPopDialog(mContext); |
里面的那个方法就是控制位置和大小的
1 | private void setPromptWin(OBDPopDialog dia) { |
Dialog设置全屏时隐藏状态栏
1 | public class OBDDialogP extends Dialog { |
里面的Style 文件:
1 | <!--Dialog 样式 四周没有边框 加 全屏时不会有隐藏标题栏--> |
调用的时候
1 | OBDDialogP dialog = new OBDDialogP(this); |
自定义方法:
1 | private void setPromptWin(OBDDialogP dia) { |
Dialog全屏(不隐藏状态栏)
1 | import android.app.Activity; |
1 |
|
使用
1 | if (newSearchMoreDialog == null) { |
dialog禁止系统返回键(包含手势)
1 | //dialog禁止系统返回键(包含手势) |
弹软键盘后再弹Dialog,软键盘不要收缩
Dialog中加载了ProgressBar,来当全局的loading
- Activity的清单文件中不要设置
android:windowSoftInputMode
,即用默认的 - Dialog的style中添加
<item name="android:windowSoftInputMode">stateUnchanged</item>
- 在Activity初始化完成的时候,editText获取下焦点,让它弹出软键盘
完整代码:
Dialog的style
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<style name="Loading" parent="@android:style/Theme.Dialog">
<item name="android:windowFrame">@null</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
<!-- 设置背景色 透明-->
<item name="android:background">@android:color/transparent</item>
<item name="android:windowBackground">@android:color/transparent</item>
<!-- 设置是否显示背景 -->
<item name="android:backgroundDimEnabled">true</item>
<!-- 设置背景透明度 -->
<item name="android:backgroundDimAmount">0</item>
<!-- 设置点击空白不消失 -->
<item name="android:windowCloseOnTouchOutside">false</item>
<item name="android:windowSoftInputMode">stateUnchanged</item>
</style>LoadingDialog.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27public abstract class LoadingDialog extends Dialog {
private Window window;
public abstract void cancle();
public LoadingDialog( { Context context)
super(context, R.style.Loading);
//加载布局
setContentView(R.layout.view_loading);
//设置Dialog参数
if (window == null) {
window = getWindow();
}
WindowManager.LayoutParams params = window.getAttributes();
params.gravity = Gravity.CENTER;
window.setAttributes(params);
}
public void onBackPressed() {
//回调
cancle();
//关闭Loading
dismiss();
}
}view_loading.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/dp64"
android:layout_height="@dimen/dp64"
android:background="@drawable/loading_background_20"
android:gravity="center"
android:orientation="vertical">
<RelativeLayout
android:id="@+id/loading_rl"
android:layout_width="@dimen/dp40"
android:layout_height="@dimen/dp40"
android:gravity="center">
<ProgressBar
android:id="@+id/loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:indeterminateBehavior="repeat"
android:indeterminateDrawable="@drawable/anim" />
</RelativeLayout>
</LinearLayout>调用Dialog的地方
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36private LoadingDialog loadingDialog;
public void showLoading() {
showLoading(true);
}
public void showLoading(boolean cancelable) {
try {
if (loadingDialog == null) {
loadingDialog = new LoadingDialog(mView.getUIContext()) {
public void cancle() {
}
};
}
loadingDialog.setCanceledOnTouchOutside(cancelable);
if (mView != null && !(mView.getUIContext() instanceof ViewPager.DecorView)
&& !loadingDialog.isShowing()) {
loadingDialog.show();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void dismissLoading() {
try {
if (mView != null && !(mView.getUIContext() instanceof ViewPager.DecorView)
&& loadingDialog != null && loadingDialog.isShowing()) {
loadingDialog.dismiss();
}
} catch (Exception e) {
e.printStackTrace();
}
}
xm597的Dialog
BaseDialog
1 | import android.app.Activity; |
其中的 R.style.BaseDialogStyle
1 | //styles.xml |
1 | //anim_bottom_in.xml |
使用
单个Rv内容的底部弹窗
public class BaseOneRvDialog<T extends IPickerViewData> extends BaseDialog {}
单列或两列滚轮的弹窗
public class MultiSalaryDialog extends BaseDialog {}
另一套Dialog(DataBinding)
基础
1 | import android.app.Dialog; |
使用-普通弹窗
继承上面的
1 | import android.content.Context; |
其中的布局
layout_base_show_tips_dialog.xml
1 |
|
调用
1 | SimpleTipDialog tipDialog = new SimpleTipDialog(getActivity()); |
如果两个按钮都有点击事件,那么用
1
2
3
4
5
6
7
8
9
10
11 tipDialog.setSimpleTipDialogListener1(new SimpleTipDialog.ISimpleTipDialogListener1() {
@Override
public void onCancelClick() {
//这个是左侧按钮的点击事件
}
@Override
public void onConfirmClick() {
//这个是左侧按钮的点击事件
}
});
使用-图片+一个按钮
1 |
|
其中的布局
R.layout.layout_dialog_bind_wechat.xml
1 |
|
调用
1 | private BindWechatCheckDialog mBindWechatCheckDialog;//成员变量 |
Activity伪装成Dialog
在注册清单文件中把这个Activity的theme改成dialog的样式即可。
1 |
|
DialogFragment
https://github.com/crazyqiang/AndroidStudy
场景
- 不用提供布局,内置项目中常用默认的样式
- 支持自定义复杂的布局、动画、对话框大小、背景色等设置
- 统一管理多个dialog并顺序弹出
使用
引入lib_dialog这个库
1 | //settings.gradle |
在代码中使用
一个按钮
1 | //一个按钮 |
两个按钮
1 | //两个按钮 |
使用自定义布局
1 | //使用自定义布局 |
统一管理多个Dialog依次弹出
1 | SYDialog.Builder builder1 = new SYDialog.Builder(this); |
Dialog引发的内存泄露
就是在activity关闭的时候dialog还在show状态
解决 :(添加lifecycleObserver进行生命周期监听)
1 | import androidx.activity.ComponentActivity; |
Dialog相关问题
Dialog上使用加载框progressdialog不显示
Dialog改变message无效的问题
1 | //关于加载框或者是dialogfragment,中途改变message消息无效的问题: |
dialog不居中的问题
1 | Window dialogWindow = mProgressDlg.getWindow(); |
1 | //去除tile布局 mProgressDlg.requestWindowFeature(Window.FEATURE_NO_TITLE); |
Unable to add window – token null is not valid
问题详情:android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
排查:dialog和progressbar等不能在ApplicationContext中创建,需要依托于Activity
解决:
添加了windowSoftInputMode=adjustPan|adjustResize还是会被软键盘盖住
Activity的清单文件中加了 android:windowSoftInputMode="adjustResize|adjustPan"
,但dialog带edittext还是会被软键盘盖住(不会顶起来)
解决:原来是Activity在清单文件中的主题带有 <item name="android:windowTranslucentStatus" tools:targetApi="19">true</item>
属性,导致这个顶起效果失效,改activity的主题为android:theme="@style/Theme.AppCompat.Light.NoActionBar"