小米手机 Toast 显示带应用名称问题解决方法

Author Avatar
dev.liang 4月 24, 2019
  • 在其它设备中阅读本文章

小米 Toast 问题

小米 青春8 手机,有不少适配问题,最令人不舒服的是 Toast 内容前带应用名称。

网上的方案

网上的解决方法很多,诸如下面这种方式的很多:

1
2
3
4
5
6
7
8
9
10
private Toast toast;
public void show(String text) {
if (toast == null) {
toast = Toast.makeText(this, null, Toast.LENGTH_SHORT);
toast.setText(text);
} else {
toast.setText(text);
}
toast.show();
}

makeText() 后第二个参数为 null ,自测了下,确实是没有了烦人的应用名称。

但是如果留心看 log 日志的话,会报这样一个异常:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
W/System.err: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.String java.lang.CharSequence.toString()' on a null object reference
W/System.err: at android.widget.ToastInjector.addAppName(ToastInjector.java:50)
W/System.err: at android.widget.Toast.makeText(Toast.java:287)
W/System.err: at android.widget.Toast.makeText(Toast.java:270)
W/System.err: at com.android.rxjavaproject.MainActivity.show(MainActivity.java:105)
W/System.err: at com.android.rxjavaproject.MainActivity.onCreate(MainActivity.java:98)
W/System.err: at android.app.Activity.performCreate(Activity.java:7210)
W/System.err: at android.app.Activity.performCreate(Activity.java:7201)
W/System.err: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1272)
W/System.err: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2926)
W/System.err: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3081)
W/System.err: at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
W/System.err: at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
W/System.err: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
W/System.err: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1831)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:106)
W/System.err: at android.os.Looper.loop(Looper.java:201)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6806)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)

NullPointerException 异常,这样的问题是小米手机新版本系统,深度定制导致的。

个人的处理方式是这样的:

1
2
3
4
5
6
7
8
9
public void show(String text) {
if (toast == null) {
toast = Toast.makeText(this, text, Toast.LENGTH_SHORT);
toast.setText(text);
} else {
toast.setText(text);
}
toast.show();
}

makeText() text 参数正常设置,之后再重新 set 下,这样既保证了去掉包名,也没有任何异常。另外我们也可以尝试自定义 toast 来满足 toast 需求。