当前位置: 首页 > 编程笔记 >

Android 5.0以上Toast不显示的解决方法

丁弘新
2023-03-14
本文向大家介绍Android 5.0以上Toast不显示的解决方法,包括了Android 5.0以上Toast不显示的解决方法的使用技巧和注意事项,需要的朋友参考一下

原因分析

用户使用android 5.0以上的系统在安装APP时,将消息通知的权限关闭掉了。实际上用户本意只是想关闭Notification,但是Toast的show方法中有调用INotificationManager这个类,而这个类在用户关闭消息通知权限的同时被禁用了,所以我们的吐司无法显示。

Toast.show()

效果图

自定义Toast(上)与Toast(下)比对

问题解决

既然系统不允许我们调用Toast,那么我们就自立门户——自己写一个Toast出来。我们总体的思路是:在Activity的布局中添加View实现Toast的效果。

Toast背景shape定义

我们知道shape的背景是一个半透明黑色的圆角效果:


Toast

因此我们使用的是shape的corners和solid结点:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
 <solid android:color="#99000000" />
 <corners android:radius="8dp" />
</shape>

定义布局

布局中我们主要使用TextView控件,设置相应的边距和背景即可,布局代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/mbContainer"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:layout_marginBottom="200dp"
 android:gravity="bottom|center"
 android:orientation="vertical"
 android:paddingLeft="50dp"
 android:paddingRight="50dp">

 <LinearLayout android:id="@+id/toast_linear"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:background="@drawable/shape_toastutils_bg"
  android:gravity="bottom|center"
  android:orientation="vertical"
  android:padding="8dp">

  <TextView android:id="@+id/mbMessage"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_gravity="center_vertical"
   android:layout_margin="5dp"
   android:layout_weight="1"
   android:gravity="center"
   android:shadowColor="#BB000000"
   android:shadowRadius="2.75"
   android:textSize="12sp"
   android:textColor="#FFFFFFFF" />
 </LinearLayout>
</LinearLayout>

java代码逻辑

自定义Toast的java代码逻辑主要模仿系统Toast的makeText() 、show()两个方法,此外还需要reset()方法,实现Toast显示过程中Activity切换时context也随之切换,关键代码如下:

makeText(Context context, String message, int HIDE_DELAY)方法:

public static ToastUtils makeText(Context context, String message,
        int HIDE_DELAY) {
 if (mInstance == null) {
  mInstance = new ToastUtils(context);
 } else {
  // 考虑Activity切换时,Toast依然显示
  if (!mContext.getClass().getName().endsWith(context.getClass().getName())) {
   mInstance = new ToastUtils(context);
  }
 }
 if (HIDE_DELAY == LENGTH_LONG) {
  mInstance.HIDE_DELAY = 2500;
 } else {
  mInstance.HIDE_DELAY = 1500;
 }
 mTextView.setText(message);
 return mInstance;
}

makeText(Context context, int resId, int HIDE_DELAY)方法

public static ToastUtils makeText(Context context, int resId, int HIDE_DELAY) {
 String mes = "";
 try {
  mes = context.getResources().getString(resId);
 } catch (Resources.NotFoundException e) {
  e.printStackTrace();
 }
 return makeText(context, mes, HIDE_DELAY);
}

show()方法

public void show() {
 if (isShow) {
  // 若已经显示,则不再次显示
  return;
 }
 isShow = true;
 // 显示动画
 mFadeInAnimation = new AlphaAnimation(0.0f, 1.0f);
 // 消失动画
 mFadeOutAnimation = new AlphaAnimation(1.0f, 0.0f);
 mFadeOutAnimation.setDuration(ANIMATION_DURATION);
 mFadeOutAnimation
   .setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
     // 消失动画后更改状态为 未显示
     isShow = false;
    }
    @Override
    public void onAnimationEnd(Animation animation) {
     // 隐藏布局,不使用remove方法为防止多次创建多个布局
     mContainer.setVisibility(View.GONE);
    }
    @Override
    public void onAnimationRepeat(Animation animation) {
    }
   });
 mContainer.setVisibility(View.VISIBLE);
 mFadeInAnimation.setDuration(ANIMATION_DURATION);
 mContainer.startAnimation(mFadeInAnimation);
 mHandler.postDelayed(mHideRunnable, HIDE_DELAY);
}

方法调用

自定义Toast的使用与系统Toast类似,调用方法如下:

ToastUtils.makeText(context, "消息内容",ToastUtils.LENGTH_SHORT).show();

总结

以上就是这篇文章的全部内容了,希望本文的内容对各位Android开发者们能有所帮助,如果有疑问大家可以留言交流。

 类似资料:
  • 本文向大家介绍tensorboard 可以显示graph,却不能显示scalar的解决方式,包括了tensorboard 可以显示graph,却不能显示scalar的解决方式的使用技巧和注意事项,需要的朋友参考一下 今天照着样例搞了下tensorboard,发现自己无法显示scalar,而graph却可以正常显示。 出现这种情况就说明,tensorfboard已经正确读取了指定目录下的数据,只是数

  • 本文向大家介绍vue2.0 路由不显示router-view的解决方法,包括了vue2.0 路由不显示router-view的解决方法的使用技巧和注意事项,需要的朋友参考一下 今天学习vue2.0 的 router-view , 爆出的错误不计其数,不知道哪位大神写的router-view,配置的参数竟然不是router,而是routes =_=|| 这是花了一上午整出来的main.js,还有网上

  • 将“然后向我显示页面”这一行添加到cucumber场景中,在我同事的计算机上使用相同的设置,但在我的计算机上则不然。实际上,添加暂停步骤定义并调用它似乎被完全忽略了。 步骤定义: 功能: 命令行: 使用Firefox 16.02(避免17中的错误) 两台机器都有git-fetch'd,拉取,捆绑安装,所以所有的宝石都是相同的,都使用Rbenv版本* 1.9.3-p327-perf。我可能错过了一些

  • 本文向大家介绍Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法,包括了Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法的使用技巧和注意事项,需要的朋友参考一下 项目地址:https://github.com/PythonerKK/django-generate-pdf/tree/master 这个demo实现了通过用户输入自己的个人信息生成一份简历pdf,来

  • 本文向大家介绍vue小图标favicon不显示的解决方案,包括了vue小图标favicon不显示的解决方案的使用技巧和注意事项,需要的朋友参考一下 vue脚手架虽然好用,但是文件配置问题一直很头疼。 将原生的代码用vue框架来做,出现种种问题,之前设置小图标的时候也出现了问题,总结了网上的解决方案,在此记下对我亲自试验并奏效的方案: 我是直接将favico.ico丢到根目录(就是src同级的目录)

  • 本文向大家介绍解决matplotlib库show()方法不显示图片的问题,包括了解决matplotlib库show()方法不显示图片的问题的使用技巧和注意事项,需要的朋友参考一下 最近使用python里的matplotlib库绘图,想在代码结束时显示图片看看,结果图片一闪而过,附上我原来代码: 我上网查了一下,在遇到show()方法无法显示图片或者图片一闪而过,解决方案分两步: 1.加头文件,完整