Skip to content

Commit 5f45886

Browse files
committed
新增框架常见疑问文档
补充和优化框架使用文档 补充显示长短 Toast 方法 优化框架部分字段命名及注释 优化 ToastUtils 方法实现逻辑
1 parent 535ebed commit 5f45886

File tree

9 files changed

+323
-104
lines changed

9 files changed

+323
-104
lines changed

HelpDoc.md

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
#### 目录
2+
3+
* [怎么自定义 Toast 显示动画](#怎么自定义-toast-显示动画)
4+
5+
* [怎么自定义 Toast 显示时长](#怎么自定义-toast-显示时长)
6+
7+
* [怎么自定义 Toast 布局样式](#怎么自定义-toast-布局样式)
8+
9+
* [怎么切换成 Toast 排队显示的策略](#怎么切换成-toast-排队显示的策略)
10+
11+
* [框架无法满足我当前使用的场景怎么办](#框架无法满足我当前使用的场景怎么办)
12+
13+
* [为什么框架优先使用 WindowManager 来实现 Toast](#为什么框架优先使用-windowManager-来实现-toast)
14+
15+
#### 怎么自定义 Toast 显示动画
16+
17+
* 在 Toast 初始化的时候,修改 Toast 策略即可
18+
19+
```java
20+
ToastUtils.init(this, new ToastStrategy() {
21+
22+
@Override
23+
public IToast createToast(IToastStyle<?> style) {
24+
if (toast instanceof CustomToast) {
25+
CustomToast customToast = ((CustomToast) toast);
26+
// 设置 Toast 动画效果
27+
customToast.setAnimationsId(R.anim.xxx);
28+
}
29+
return toast;
30+
}
31+
});
32+
```
33+
34+
* 这种方式的缺点是只有应用在前台的情况下才会生效,这是因为前台的 Toast 是用框架实现的,本质上是一个 WindowManager,优点是非常灵活,不受系统 Toast 机制限制,缺点是无法在后台的情况下显示;而后台的 Toast 是用系统来实现的,优点是能在后台的情况下显示,缺点是局限性非常大,无法做太深的定制化;而框架正是利用了两种方式的优缺点进行了互补。
35+
36+
#### 怎么自定义 Toast 显示时长
37+
38+
* 在 Toast 初始化的时候,修改 Toast 策略即可
39+
40+
```java
41+
ToastUtils.init(this, new ToastStrategy() {
42+
43+
@Override
44+
public IToast createToast(IToastStyle<?> style) {
45+
IToast toast = super.createToast(style);
46+
if (toast instanceof CustomToast) {
47+
CustomToast customToast = ((CustomToast) toast);
48+
// 设置短 Toast 的显示时长(默认是 2000 毫秒)
49+
customToast.setShortDuration(1000);
50+
// 设置长 Toast 的显示时长(默认是 3500 毫秒)
51+
customToast.setLongDuration(5000);
52+
}
53+
return toast;
54+
}
55+
});
56+
```
57+
58+
* 这种方式的缺点是只有应用在前台的情况下才会生效,这是因为前台的 Toast 是用框架实现的,本质上是一个 WindowManager,优点是非常灵活,不受系统 Toast 机制限制,缺点是无法在后台的情况下显示;而后台的 Toast 是用系统来实现的,优点是能在后台的情况下显示,缺点是局限性非常大,无法做太深的定制化;而框架正是利用了两种方式的优缺点进行了互补。
59+
60+
#### 怎么自定义 Toast 布局样式
61+
62+
* 如果你想设置全局的 Toast 样式,可以这样调用(选择任一一种即可)
63+
64+
```java
65+
// 修改 Toast 布局
66+
ToastUtils.setView(int id);
67+
```
68+
69+
```java
70+
// 修改 Toast 布局,Toast 显示重心,Toast 显示位置偏移
71+
ToastUtils.setStyle(IToastStyle<?> style);
72+
```
73+
74+
* 如果你想为某次 Toast 显示设置单独的样式,可以这样样用(选择任一一种即可)
75+
76+
```java
77+
// 修改 Toast 布局
78+
ToastParams params = new ToastParams();
79+
params.text = "我是自定义布局的 Toast(局部生效)";
80+
params.style = new CustomViewToastStyle(R.layout.toast_custom_view);
81+
ToastUtils.show(params);
82+
```
83+
84+
```java
85+
// 修改 Toast 布局、Toast 显示重心、Toast 显示位置偏移
86+
ToastParams params = new ToastParams();
87+
params.text = "我是自定义布局的 Toast(局部生效)";
88+
params.style = new CustomViewToastStyle(R.layout.toast_custom_view, Gravity.CENTER, 10, 20);
89+
ToastUtils.show(params);
90+
```
91+
92+
#### 怎么切换成 Toast 排队显示的策略
93+
94+
* 只需要修改 Toast 框架的初始化方式,手动传入 Toast 策略类,这里使用框架已经封装好的 ToastStrategy 类即可,
95+
96+
```java
97+
// 初始化 Toast 框架
98+
// ToastUtils.init(this);
99+
ToastUtils.init(this, new ToastStrategy(ToastStrategy.SHOW_STRATEGY_TYPE_QUEUE));
100+
```
101+
102+
* 注意构造函数需要传入 `ToastStrategy.SHOW_STRATEGY_TYPE_QUEUE`,关于这个字段的介绍可以看下面的代码注释
103+
104+
```
105+
public class ToastStrategy
106+
107+
/**
108+
* 即显即示模式(默认)
109+
*
110+
* 在发起多次 Toast 的显示请求情况下,显示下一个 Toast 之前
111+
* 会先立即取消上一个 Toast,保证当前显示 Toast 消息是最新的
112+
*/
113+
public static final int SHOW_STRATEGY_TYPE_IMMEDIATELY = 0;
114+
115+
/**
116+
* 不丢消息模式
117+
*
118+
* 在发起多次 Toast 的显示请求情况下,等待上一个 Toast 显示 1 秒或者 1.5 秒后
119+
* 然后再显示下一个 Toast,不按照 Toast 的显示时长来,因为那样等待时间会很长
120+
* 这样既能保证用户能看到每一条 Toast 消息,又能保证用户不会等得太久,速战速决
121+
*/
122+
public static final int SHOW_STRATEGY_TYPE_QUEUE = 1;
123+
}
124+
```
125+
126+
#### 框架无法满足我当前使用的场景怎么办
127+
128+
* ToastUtils 框架意在解决一些的 Toast 需求,如果 ToastUtils 无法满足你的需求,你可以考虑使用 [XToast](https://github.com/getActivity/XToast) 悬浮窗框架来实现。
129+
130+
#### 为什么框架优先使用 WindowManager 来实现 Toast
131+
132+
* 系统 Toast 的坑太多了,主要问题表现如下:
133+
134+
* 系统 Toast 会引发一些内存泄漏的问题
135+
136+
* 系统 Toast 无法实现自定义显示动画、显示时长控制
137+
138+
* Android 7.1 版本会主线程阻塞会出现 BadTokenException 的问题
139+
140+
* Android 10.0 以下关闭通知栏权限会导致系统 Toast 显示不出来的问题
141+
142+
* Android 11 及以上版本,无法自定义 Toast 样式(布局、位置重心、位置偏移)
143+
144+
* 所以框架优先使用 WindowManager 来实现 Toast 显示,具体优缺点以下:
145+
146+
* 优点
147+
148+
* 不会出现内存泄漏,也不会有那么多奇奇怪怪的问题
149+
150+
* 可定制程度高,支持自定义动画和自定义显示时长
151+
152+
* 突破 Google 在新版本 Android 对 Toast 的一些限制
153+
154+
* 缺点
155+
156+
* WindowManager 无法在没有悬浮窗权限情况下在后台弹出 <br> (框架的解决方案:如果是在后台的情况下显示,则使用系统的 Toast 来显示)
157+
158+
* WindowManager 会和 Activity 绑定,会随 Activity 销毁而消失 <br> (框架的解决方案:延迟 200 毫秒显示,由此等待最新的 Activity 创建出来才调用显示,这样 WindowManager 就和最新 Activity 绑定在一起,就不会出现和旧 Activity finish 时一起消失的问题)
159+
160+
* 当然不是说用系统 Toast 就不好,用 WindowManger 一定就好,视具体的使用场景而定,我觉得最好的方式是:应用在前台的情况下使用 WindowManager 来显示,在后台的情况下使用系统 Toast 来显示,两者相结合,优势互补才是最佳方案。

README.md

Lines changed: 27 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
* 博客地址:[只需体验三分钟,你就会跟我一样,爱上这款 Toast](https://www.jianshu.com/p/9b174ee2c571)
66

7-
* 可以扫码下载 Demo 进行演示或者测试,如果扫码下载不了的,[点击此处可直接下载](https://github.com/getActivity/ToastUtils/releases/download/11.0/ToastUtils.apk)
7+
* 可以扫码下载 Demo 进行演示或者测试,如果扫码下载不了的,[点击此处可直接下载](https://github.com/getActivity/ToastUtils/releases/download/11.2/ToastUtils.apk)
88

99
![](picture/demo_code.png)
1010

@@ -47,7 +47,7 @@ android {
4747
4848
dependencies {
4949
// 吐司框架:https://github.com/getActivity/ToastUtils
50-
implementation 'com.github.getActivity:ToastUtils:11.0'
50+
implementation 'com.github.getActivity:ToastUtils:11.2'
5151
}
5252
```
5353

@@ -72,31 +72,46 @@ public class XxxApplication extends Application {
7272
// 显示 Toast
7373
ToastUtils.show(CharSequence text);
7474
ToastUtils.show(int id);
75-
ToastUtils.show(ToastParams params);
75+
ToastUtils.show(Object object);
7676

7777
// debug 模式下显示 Toast
78-
ToastUtils.debugShow(int id);
7978
ToastUtils.debugShow(CharSequence text);
79+
ToastUtils.debugShow(int id);
80+
ToastUtils.debugShow(Object object);
8081

8182
// 延迟显示 Toast
82-
ToastUtils.delayedShow(int id, long delayMillis);
8383
ToastUtils.delayedShow(CharSequence text, long delayMillis);
84+
ToastUtils.delayedShow(int id, long delayMillis);
85+
ToastUtils.delayedShow(Object object, long delayMillis);
86+
87+
// 显示短 Toast
88+
ToastUtils.showShort(CharSequence text);
89+
ToastUtils.showShort(int id);
90+
ToastUtils.showShort(Object object);
91+
92+
// 显示长 Toast
93+
ToastUtils.showLong(CharSequence text);
94+
ToastUtils.showLong(int id);
95+
ToastUtils.showLong(Object object);
96+
97+
// 自定义显示 Toast
98+
ToastUtils.show(ToastParams params);
8499

85100
// 取消 Toast
86101
ToastUtils.cancel();
87102

88-
// 设置 Toast 布局
103+
// 设置 Toast 布局(全局生效)
89104
ToastUtils.setView(int id);
90105

91-
// 设置 Toast 布局样式
106+
// 设置 Toast 布局样式(全局生效)
92107
ToastUtils.setStyle(IToastStyle<?> style);
93108
// 获取 Toast 布局样式
94109
ToastUtils.getStyle()
95110

96111
// 判断当前框架是否已经初始化
97112
ToastUtils.isInit();
98113

99-
// 设置 Toast 策略
114+
// 设置 Toast 策略(全局生效)
100115
ToastUtils.setStrategy(IToastStrategy strategy);
101116
// 获取 Toast 策略
102117
ToastUtils.getStrategy();
@@ -105,43 +120,19 @@ ToastUtils.getStrategy();
105120
ToastUtils.setGravity(int gravity);
106121
ToastUtils.setGravity(int gravity, int xOffset, int yOffset);
107122

108-
// 设置 Toast 拦截器
123+
// 设置 Toast 拦截器(全局生效)
109124
ToastUtils.setInterceptor(IToastInterceptor interceptor);
110125
// 获取 Toast 拦截器
111126
ToastUtils.getInterceptor();
112127
```
113128

114-
* 如果你需要对 Toast 的进行深度定制化,可以使用以下方式
115-
116-
```java
117-
ToastUtils.init(this, new ToastStrategy() {
118-
119-
@Override
120-
public IToast createToast(Application application) {
121-
IToast toast = super.createToast(application);
122-
if (toast instanceof CustomToast) {
123-
CustomToast customToast = ((CustomToast) toast);
124-
// 设置 Toast 动画效果
125-
customToast.setAnimationsId(R.anim.xxx);
126-
// 设置短 Toast 的显示时长(默认是 2000 毫秒)
127-
customToast.setShortDuration(1000);
128-
// 设置长 Toast 的显示时长(默认是 3500 毫秒)
129-
customToast.setLongDuration(5000);
130-
}
131-
return toast;
132-
}
133-
});
134-
```
135-
136-
* 这种方式的缺点是只有应用在前台的情况下才会生效,这是因为前台的 Toast 是用框架实现的,本质上是一个 WindowManager,优点是非常灵活,不受原生 Toast 机制限制,缺点是无法在后台的情况下显示;而后台的 Toast 是用系统来实现的,优点是能在后台的情况下显示,缺点是局限性非常大,无法做太深的定制化;而框架正是利用了两种方式的优缺点进行了互补。
137-
138-
### 温馨提示:框架意在解决一些常规的 Toast 需求,如果是有一些特殊的定制化需求请配搭 [XToast](https://github.com/getActivity/XToast) 悬浮窗框架使用
129+
## [常见疑问请点击此处查看](HelpDoc.md)
139130

140131
#### 不同 Toast 框架之间的对比
141132

142133
| 功能或细节 | [ToastUtils](https://github.com/getActivity/ToastUtils) | [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode) | [Toasty](https://github.com/GrenderG/Toasty) |
143134
| :----: | :------: | :-----: | :-----: |
144-
| 对应版本 | 11.0 | 1.30.6 | 1.5.0 |
135+
| 对应版本 | 11.2 | 1.30.6 | 1.5.0 |
145136
| issues 数 | [![](https://img.shields.io/github/issues/getActivity/ToastUtils.svg)](https://github.com/getActivity/ToastUtils/issues) | [![](https://img.shields.io/github/issues/Blankj/AndroidUtilCode.svg)](https://github.com/Blankj/AndroidUtilCode/issues) | [![](https://img.shields.io/github/issues/GrenderG/Toasty.svg)](https://github.com/GrenderG/Toasty/issues) |
146137
| **aar 包大小** | 31 KB | 500 KB | 50 KB |
147138
| 框架维护状态 | **维护中** | 停止维护 | 停止维护 |
@@ -151,7 +142,7 @@ ToastUtils.init(this, new ToastStrategy() {
151142
| 支持设置**全局** Toast 样式 ||||
152143
| 支持 Toast **即显即示** ||||
153144
| 支持 Toast **排队显示** ||||
154-
| 支持 Toast **延迟显示** ||||
145+
| 支持 Toast **延迟显示** ||||
155146
| **处理 Toast 在 Android 7.1 崩溃的问题** ||||
156147
| **兼容通知栏权限关闭后 Toast 显示不出来的问题** ||||
157148
| **适配 Android 11 不能在后台显示 Toast 的问题** ||||

app/build.gradle

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ android {
77
applicationId "com.hjq.toast.demo"
88
minSdkVersion 16
99
targetSdkVersion 31
10-
versionCode 1100
11-
versionName "11.0"
10+
versionCode 1120
11+
versionName "11.2"
1212
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
1313
}
1414

@@ -62,16 +62,14 @@ dependencies {
6262
implementation 'com.google.android.material:material:1.4.0'
6363

6464
// 标题栏框架:https://github.com/getActivity/TitleBar
65-
implementation 'com.github.getActivity:TitleBar:9.5'
65+
implementation 'com.github.getActivity:TitleBar:9.6'
6666

6767
// 权限请求框架:https://github.com/getActivity/XXPermissions
6868
implementation 'com.github.getActivity:XXPermissions:16.2'
6969

7070
// 悬浮窗框架:https://github.com/getActivity/XToast
71-
implementation 'com.github.getActivity:XToast:8.5'
71+
implementation 'com.github.getActivity:XToast:8.6'
7272

7373
// 内存泄漏捕捉:https://github.com/square/leakcanary
7474
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.9.1'
75-
76-
implementation 'com.tencent.mars:mars-xlog:1.2.6'
7775
}

app/src/main/java/com/hjq/toast/demo/MainActivity.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,14 @@ public void showToast(View v) {
5151
ToastUtils.show("我是普通的 Toast");
5252
}
5353

54+
public void showShortToast(View v) {
55+
ToastUtils.showShort("我是一个短 Toast");
56+
}
57+
58+
public void showLongToast(View v) {
59+
ToastUtils.showLong("我是一个长 Toast");
60+
}
61+
5462
public void showThriceToast(View v) {
5563
for (int i = 0; i < 3; i++) {
5664
ToastUtils.show("我是第 " + (i + 1) + " 个 Toast");
@@ -102,7 +110,14 @@ public void switchToastStrategy(View v) {
102110
}
103111

104112
public void toBackgroundShowToast(View v) {
105-
Snackbar.make(getWindow().getDecorView(), "温馨提示:安卓 10 在后台显示 Toast 需要有通知栏权限或者悬浮窗权限的情况下才可以显示", Snackbar.LENGTH_SHORT).show();
113+
Snackbar.make(getWindow().getDecorView(), "系好安全带,即将跳转到手机桌面", Snackbar.LENGTH_SHORT).show();
114+
115+
v.postDelayed(new Runnable() {
116+
@Override
117+
public void run() {
118+
Snackbar.make(getWindow().getDecorView(), "温馨提示:安卓 10 在后台显示 Toast 需要有通知栏权限或者悬浮窗权限的情况下才可以显示", Snackbar.LENGTH_SHORT).show();
119+
}
120+
}, 2000);
106121

107122
v.postDelayed(new Runnable() {
108123
@Override
@@ -111,7 +126,7 @@ public void run() {
111126
intent.addCategory(Intent.CATEGORY_HOME);
112127
startActivity(intent);
113128
}
114-
}, 2000);
129+
}, 4000);
115130

116131
v.postDelayed(new Runnable() {
117132
@Override
@@ -126,7 +141,7 @@ public void run() {
126141
ToastUtils.show("我是在后台显示的 Toast");
127142
}
128143
}
129-
}, 3000);
144+
}, 5000);
130145
}
131146

132147
public void combinationXToastShow(View v) {

0 commit comments

Comments
 (0)