因为你拒绝了App通知栏的相关权限
我们看下Toast源码
public void show() {
if (mNextView == null) {
throw new RuntimeException("setView must have been called");
}
INotificationManager service = getService();
String pkg = mContext.getOpPackageName();
TN tn = mTN;
tn.mNextView = mNextView;
try {
service.enqueueToast(pkg, tn, mDuration);
} catch (RemoteException e) {
// Empty
}
}
如果你关闭了通知栏权限这个INotificationManager 就报异常造成无法显示吐司
解决办法如下:
工程目录下 build.gradle
allprojects {
repositories {
...
maven { url 'https://www.jitpack.io' }
}
}
项目目录下build.gradle
dependencies {
implementation 'com.github.liangchaojie:ToastUtil:v1.1'
}
1 在你的Application初始化
public class APP extends Application {
@Override
public void onCreate() {
super.onCreate();
ToastUtil.init(this);
}
}
2 直接调用
ToastUtil.show(this,"hahah");
3 如果你想自定义吐司
ToastUtil.show(this,"hahah", new IToast() {
@Override
public int gravity() {
return 0;
}
@Override
public int xOffest() {
return 0;
}
@Override
public int yOffest() {
return 0;
}
@Override
public int windowAnimations() {
return 0;
}
@Override
public int duration() {
return 0;
}
@Override
public View view(Context context) {
// View view=LayoutInflater.from(context).inflate(R.layout.activity_main, null);
TextView textView = new TextView(context);
textView.setText("虽然没有权限但是我还是弹出了吐司虽然没有权限但是我还是弹出了吐司虽然没有权限但是我还是弹出了吐司!");
return textView;
}
});
使用就到到这里,如果不满足于使用还想知道具体的代码逻辑请继续看
1 先判断是否具备通知栏权限?
2 有权限就直接使用系统默认的吐司
3 没有权限就获取当前的窗口管理器在当前管理器上手动添加一个view
4 使用Handler的作用是让吐司显示若干时间后再消失
5 WindowHelper的作用是将所有Activty注册进Application,这样的话Activity销毁的时候对应的窗口管理器也销毁了,这就避免了内存泄露
想看源码的话请点击我的github 一定可以弹出来的吐司
最后感谢这篇博客的给我的启发