精华内容
下载资源
问答
  • Toast 不显示

    千次阅读 2016-09-22 10:19:55
    做项目时发现 toast不显示 原因一:在非UI线程执行 建议使用handler显示 原因二:没有执行,逻辑错误 我的问题两个都不是,在接收广播后调用了toast 并且调用toast处使用了runonUIThread(),但是 toast并没有显示...

    做项目时发现 toast不显示

    原因一:在非UI线程执行 建议使用handler显示

    原因二:没有执行,逻辑错误


    我的问题两个都不是,在接收广播后调用了toast   并且调用toast处使用了runonUIThread(),但是 toast并没有显示出来,

        查找错误点发现,在toast后 有一个主线程的耗时操作 导致的toast不显示,把耗时操作放到线程中 toast正常显示;


    找到另一篇文章:http://m.blog.csdn.net/article/details?id=37761475

    Toast中文又名土司,职责就是提示作用,不过有时候使用时,会遇到不同的麻烦;其中,Toast不显示就是其中一个,作者今天就遇到了怎么搞也不能显示Toast的问题,排查了好多原因,最终找到罪魁祸首.

    Toast通常不显示的原因(个人小结,可能不去,忘大家补充):

    1.没有调用.show方法,这种也是最常见的,有时候,也是身不由己啊.

    2.在非UI线程中调用Toast的show方法,不过这种调用的话,程序会报错的,这时通常我们通过handle来发消息来显示Toast.或者在子线程中调用Looper.prepare()来显示.

    3.网上说的还有一种原因是:线程占用了Toast的时间导致不能显示,这种状况是,在Toast的show方法调用后,紧接着让主线程sleep的时间不小于show的时间,

    4.最后一种,是作者今天遇到了,搞了许久,最终才找到的,这个原因是与Android权限有关的,作者用的是屌丝机(荣耀3C),root什么的自然也就不说了,机子  设置--隐私和安全--通知管理 这里面可以对手机上安装的软件的通知消息进行管理的.我原本以为是管理Notification通知的,不晓得什么时间把他搞成禁止了,才惹出来今天的麻烦.最后附上图片:

    目前只能想到这么多了,以后如果遇到的话,在进行添加.

    关于Toast的一些其他的知识点,可以参考一下入门的http://android.tgbus.com/Android/tutorial/201103/346236.shtml或者搜索一些,网上资料很丰富的.


    我的问题同第三点,


    同时,补充一点:

    程序中 在两个地方同时接受广播,在一个接收器操作结束后,另一个接收器才接收到该广播;



    展开全文
  • Toast不显示

    2014-08-14 18:18:08
    1、Toast只能在UI线程上才能显示
    Toast只能在UI线程上才能显示
    
    展开全文
  • 最近在开发中我们经常会在适配5.0以后的机型遇到各种各样的问题,其中有一个不大不小的问题就是:Toast不显示问题,这篇文章就给大家总结了Android 5.0以上Toast不显示的原因与解决方法,有需要的朋友们可以参考借鉴...
  • 部分手机Toast不显示的解决办法

    千次阅读 2019-03-25 05:48:41
    部分手机可能Toast不显示,换其他手机是正常的 这是因为Toast显示需要NotificationManagerService(查看Android源码) 部分手机把通知权限关闭了,所以Toast无法正常弹出 解决办法跳过NotificationManagerService...

    转载请标明地址 QuincySx: www.jianshu.com/p/f59022012…

    部分手机可能Toast不显示,换其他手机是正常的

    这是因为Toast显示需要NotificationManagerService(查看Android源码)

    部分手机把通知权限关闭了,所以Toast无法正常弹出

    解决办法跳过NotificationManagerService自己维护一个队列

    public class CustomToast implements IToast {
    
        private static Handler mHandler = new Handler();
    
        /**
         * 维护toast的队列
         */
        private static BlockingQueue<CustomToast> mQueue = new LinkedBlockingDeque<>();
    
        /**
         * 原子操作:判断当前是否在读取{@linkplain #mQueue 队列}来显示toast
         */
        private static AtomicInteger mAtomicInteger = new AtomicInteger(0);
    
        private WindowManager mWindowManager;
    
        private long mDurationMillis;
    
        private View mView;
    
        private WindowManager.LayoutParams mParams;
    
        private Context mContext;
    
        public void makeTextShow(String text, long duration) {
            new CustomToast(mContext)
                    .setText(text)
                    .setDuration(duration)
                    .setGravity(Gravity.BOTTOM, 0, 30).show();
        }
    
        public static IToast makeText(Context context, String text, long duration) {
            return new CustomToast(context)
                    .setText(text)
                    .setDuration(duration)
                    .setGravity(Gravity.BOTTOM, 0, 30);
        }
    
        /**
         * 参照Toast源码TN()写
         *
         * @param context
         */
        public CustomToast(Context context) {
            mContext = context;
            mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
            mParams = new WindowManager.LayoutParams();
            mParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
            mParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
            mParams.format = PixelFormat.TRANSLUCENT;
            mParams.windowAnimations = android.R.style.Animation_Toast;
            mParams.type = WindowManager.LayoutParams.TYPE_TOAST;
            mParams.setTitle("Toast");
            mParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager
                    .LayoutParams.FLAG_NOT_FOCUSABLE |
                    WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
            // 默认居中
            mParams.gravity = Gravity.CENTER;
        }
    
        /**
         * Set the location at which the notification should appear on the screen.
         *
         * @param gravity
         * @param xOffset
         * @param yOffset
         */
        @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
        @Override
        public IToast setGravity(int gravity, int xOffset, int yOffset) {
            // We can resolve the Gravity here by using the Locale for getting
            // the layout direction
            final int finalGravity;
            if (Build.VERSION.SDK_INT >= 14) {
                final Configuration config = mView.getContext().getResources().getConfiguration();
                finalGravity = Gravity.getAbsoluteGravity(gravity, config.getLayoutDirection());
            } else {
                finalGravity = gravity;
            }
            mParams.gravity = finalGravity;
            if ((finalGravity & Gravity.HORIZONTAL_GRAVITY_MASK) == Gravity.FILL_HORIZONTAL) {
                mParams.horizontalWeight = 1.0f;
            }
            if ((finalGravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.FILL_VERTICAL) {
                mParams.verticalWeight = 1.0f;
            }
            mParams.y = yOffset;
            mParams.x = xOffset;
            return this;
        }
    
        @Override
        public IToast setDuration(long durationMillis) {
            if (durationMillis < 0) {
                mDurationMillis = 0;
            }
            if (durationMillis == Toast.LENGTH_SHORT) {
                mDurationMillis = 2000;
            } else if (durationMillis == Toast.LENGTH_LONG) {
                mDurationMillis = 3500;
            } else {
                mDurationMillis = durationMillis;
            }
            return this;
        }
    
        /**
         * 不能和{@link #setText(String)}一起使用,要么{@link #setView(View)} 要么{@link #setView(View)}
         *
         * @param view 传入view
         * @return 自身对象
         */
        @Override
        public IToast setView(View view) {
            mView = view;
            return this;
        }
    
        @Override
        public IToast setMargin(float horizontalMargin, float verticalMargin) {
            mParams.horizontalMargin = horizontalMargin;
            mParams.verticalMargin = verticalMargin;
            return this;
        }
    
        /**
         * 不能和{@link #setView(View)}一起使用,要么{@link #setView(View)} 要么{@link #setView(View)}
         *
         * @param text 字符串
         * @return 自身对象
         */
        public IToast setText(String text) {
            // 模拟Toast的布局文件 com.android.internal.R.layout.transient_notification
            // 虽然可以手动用java写,但是不同厂商系统,这个布局的设置好像是不同的,因此我们自己获取原生Toast的view进行配置
            View view = Toast.makeText(mContext, text, Toast.LENGTH_SHORT).getView();
            if (view != null) {
                TextView tv = (TextView) view.findViewById(android.R.id.message);
                tv.setText(text);
                setView(view);
            }
            return this;
        }
    
        @Override
        public void show() {
            // 1. 将本次需要显示的toast加入到队列中
            mQueue.offer(this);
    
            // 2. 如果队列还没有激活,就激活队列,依次展示队列中的toast
            if (0 == mAtomicInteger.get()) {
                mAtomicInteger.incrementAndGet();
                mHandler.post(mActivite);
            }
        }
    
        @Override
        public void cancel() {
            // 1. 如果队列已经处于非激活状态或者队列没有toast了,就表示队列没有toast正在展示了,直接return
            if (0 == mAtomicInteger.get() && mQueue.isEmpty()) return;
    
            // 2. 当前显示的toast是否为本次要取消的toast,如果是的话
            // 2.1 先移除之前的队列逻辑
            // 2.2 立即暂停当前显示的toast
            // 2.3 重新激活队列
            if (this.equals(mQueue.peek())) {
                mHandler.removeCallbacks(mActivite);
                mHandler.post(mHide);
                mHandler.post(mActivite);
            }
        }
    
        private void handleShow() {
            if (mView != null) {
                if (mView.getParent() != null) {
                    mWindowManager.removeView(mView);
                }
                mWindowManager.addView(mView, mParams);
            }
        }
    
        private void handleHide() {
            if (mView != null) {
                // note: checking parent() just to make sure the view has
                // been added...  i have seen cases where we get here when
                // the view isn't yet added, so let's try not to crash.
                if (mView.getParent() != null) {
                    mWindowManager.removeView(mView);
                    // 同时从队列中移除这个toast
                    mQueue.poll();
                }
                mView = null;
            }
        }
    
        private static void activeQueue() {
            CustomToast toast = mQueue.peek();
            if (toast == null) {
                // 如果不能从队列中获取到toast的话,那么就表示已经暂时完所有的toast了
                // 这个时候需要标记队列状态为:非激活读取
                mAtomicInteger.decrementAndGet();
            } else {
                // 如果还能从队列中获取到toast的话,那么就表示还有toast没有展示
                // 1. 展示队首的toast
                // 2. 设置一定时间后主动采取toast消失措施
                // 3. 设置展示完毕之后再次执行本逻辑,以展示下一个toast
                mHandler.post(toast.mShow);
                mHandler.postDelayed(toast.mHide, toast.mDurationMillis);
                mHandler.postDelayed(mActivite, toast.mDurationMillis);
            }
    
        }
    
        private final Runnable mShow = new Runnable() {
            @Override
            public void run() {
                handleShow();
            }
        };
    
        private final Runnable mHide = new Runnable() {
            @Override
            public void run() {
                handleHide();
            }
        };
    
        private final static Runnable mActivite = new Runnable() {
            @Override
            public void run() {
                activeQueue();
            }
        };
    }
    复制代码
    public interface IToast {
        void makeTextShow(String text, long duration);
    
        IToast setGravity(int gravity, int xOffset, int yOffset);
    
        IToast setDuration(long durationMillis);
    
        /**
         * 不能和{@link #setText(String)}一起使用,要么{@link #setView(View)} 要么{@link #setText(String)}
         */
        IToast setView(View view);
    
        IToast setMargin(float horizontalMargin, float verticalMargin);
    
        /**
         * 不能和{@link #setView(View)}一起使用,要么{@link #setView(View)} 要么{@link #setText(String)}
         */
        IToast setText(String text);
    
        void show();
    
        void cancel();
    }
    复制代码

    上面是两个是自己实现的Toast队列 我们还写了个工厂 来进行 当 App 初始化的时候判断手机的 Toast 是否能显示,如果不能显示则使用自己维护的 Toast

    public class SystemToast implements IToast {
        private Toast mToast;
    
        private Context mContext;
    
        public void makeTextShow(String text, long duration) {
            new SystemToast(mContext)
                    .setText(text)
                    .setDuration(duration).show();
        }
    
        public static IToast makeText(Context context, String text, long duration) {
            return new CustomToast(context)
                    .setText(text)
                    .setDuration(duration);
        }
    
        public SystemToast(Context context) {
            mContext = context;
            mToast = Toast.makeText(context, "", Toast.LENGTH_SHORT);
        }
    
        @Override
        public IToast setGravity(int gravity, int xOffset, int yOffset) {
            mToast.setGravity(gravity, xOffset, yOffset);
            return this;
        }
    
        @Override
        public IToast setDuration(long durationMillis) {
            mToast.setDuration((int) durationMillis);
            return this;
        }
    
        /**
         * 不能和{@link #setText(String)}一起使用,要么{@link #setView(View)} 要么{@link #setView(View)}
         *
         * @param view 传入view
         * @return 自身对象
         */
        @Override
        public IToast setView(View view) {
            mToast.setView(view);
            return this;
        }
    
        @Override
        public IToast setMargin(float horizontalMargin, float verticalMargin) {
            mToast.setMargin(horizontalMargin, verticalMargin);
            return this;
        }
    
        /**
         * 不能和{@link #setView(View)}一起使用,要么{@link #setView(View)} 要么{@link #setView(View)}
         *
         * @param text 传入字符串
         * @return 自身对象
         */
        @Override
        public IToast setText(String text) {
            mToast.setText(text);
            return this;
        }
    
        @Override
        public void show() {
            if (mToast != null) {
                mToast.show();
            }
        }
    
        @Override
        public void cancel() {
            if (mToast != null) {
                mToast.cancel();
            }
        }
    }
    复制代码
    public class ToastFactory {
        private static final String CHECK_OP_NO_THROW = "checkOpNoThrow";
        private static final String OP_POST_NOTIFICATION = "OP_POST_NOTIFICATION";
    
        private int mCheckNotification = -1;
        private volatile static ToastFactory sToastFactory;
    
        private IToast mIToast;
    
        private ToastFactory(Context context) {
            if (isNotificationEnabled(context)) {
                mIToast = new SystemToast(context);
            } else {
                mIToast = new CustomToast(context);
            }
        }
    
        public static IToast getInstance(Context context) {
            if (sToastFactory == null) {
                synchronized (ToastFactory.class) {
                    if (sToastFactory == null) {
                        sToastFactory = new ToastFactory(context);
                    }
                }
            }
            return sToastFactory.mIToast;
        }
    
        private static boolean isNotificationEnabled(Context context) {
    
            AppOpsManager mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
            ApplicationInfo appInfo = context.getApplicationInfo();
    
            String pkg = context.getApplicationContext().getPackageName();
    
            int uid = appInfo.uid;
    
            Class appOpsClass = null; /* Context.APP_OPS_MANAGER */
    
            try {
    
                appOpsClass = Class.forName(AppOpsManager.class.getName());
    
                Method checkOpNoThrowMethod = appOpsClass.getMethod(CHECK_OP_NO_THROW, Integer.TYPE,
                        Integer.TYPE, String.class);
    
                Field opPostNotificationValue = appOpsClass.getDeclaredField(OP_POST_NOTIFICATION);
                int value = (int) opPostNotificationValue.get(Integer.class);
                return ((int) checkOpNoThrowMethod.invoke(mAppOps, value, uid, pkg) == AppOpsManager
                        .MODE_ALLOWED);
    
            } catch (Exception e) {
                e.printStackTrace();
            }
            return true;
        }
    }
    复制代码

    当用上边这个工厂进行 Toast 显示的时候会在自行维护的 Toast 队列与系统 Toast 之间选择

    展开全文
  • 开发过程中遇到的有的android 手机toast不显示,需要在手机中把该app的通知打开; 代码中可以直接设置通知权限: 会默认打开通知。

    开发过程中遇到的有的android 手机toast不显示,需要在手机中把该app的通知打开;

    代码中可以直接设置通知权限:<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    会默认打开通知。

    展开全文
  • Android 提示框Toast不显示的问题

    万次阅读 2016-11-30 22:38:38
    今天我就遇到Toast不显示的问题. 在很多时候,由于android自带的Toast在连续点击后会逐个显示出来,当你连续点击很多次之后,就算你退出软件也会显示.这就有点尴尬了,所以很多时候我们会简单的用这样的形式来避免这个...
  • Android Toast不显示

    千次阅读 2018-10-10 11:05:30
    Toast.makeText(上下文,自定义内容,时长).show(); 记得show出来
  • 360手机toast不显示

    2020-12-26 14:59:26
    两种方式均可正常弹出 UIUtils.showToast(this, "请填写手机号"); 可以弹出 UIUtils.showToast(CSApp.getApplication(), "请填写手机号"); 可以弹出</p><p>该提问来源于开源项目:Do...
  • Toast不显示原因

    千次阅读 2016-04-25 13:08:34
    前几天调用别人的SDK建立一个登录界面时,想在回调函数中创建一个Toast来提醒用户登录成功破与否,但是在别人的回调函数中谢了Toast居然没有显示出来,到网上查了一下,发现原来是没有在最后加上.show()方法,现在...
  • 4.toast不显示 Dialog 原因:和 context 有问题。 实例:来自电子签名的对话框 Activity当dailog的现实 应用场景:推送一些问答 toast不显示 当关闭通知权限后无法显示Toast的解决方案V2.0 今天...
  • 1.当通知权限被关闭时在华为等手机上Toast不显示; 2.Toast的队列机制在不同手机上可能会不相同; 3.Toast的BadTokenException问题; 当发现系统Toast存在问题时,不少同学都会采用自定义的TYPE_TOAST弹窗来实现...
  • Toast 详细
  • 红米note3Toast不弹出. 如果Toast是用ApplicationContext初始化,且在非Activity/Fragment中显示例如Dialog,就会无法显示. 使用当前Activity作为Context参数解决. 转载于:...
  • 但是子线程中真的能直接显示Toast吗?答案是:当然可以。那应该怎么操作呢?在当前线程中先初始化一个Looper即可!Looper.prepare(); Toast.makeText(getBaseContext(), "text", Toast.LENGTH_LO...
  • 頔言頔语:进步,一定要进步,...输入框 · 轱辘 · 语雀​www.yuque.com所有的项目按照流程按照一下目录进行需求分析UI设计项目代码01需求分析 02 UI设计03 项目代码0301 创建Toast组件,并在APP中全局引入0302 ...
  • Toast不显示的原因

    2017-08-10 22:17:38
    当运行与子线程时会发生不显示 修改方法 String mToastInformation; private final Handler mHandler = new Handler(Looper.getMainLooper()); private void showToastInfomation(String msg) { ...
  • Toast 不显示的问题

    千次阅读 2012-11-16 13:48:30
    在开发中遇到了一个问题:Toast显示不出来   Toast.makeText(getApplicationContext(), "toast test!", Toast.LENGTH_LONG).show(); try{  Thread.Sleep(5000); } catch(Exception ex){ }   因为Toast和...
  • 解决Toast不显示问题 Toast invisible to user . go ahead

    万次阅读 热门讨论 2015-12-07 13:31:45
    关于Toast在一些手机和Pad上不显示的解决方法: 1、Toast.makeText(Context, "这是一个Toast", Toast.LENGTH_SHORT); 如果你的调用方法为上述则只要在后面加上一个show()方法就可以解决。如: Toast.makeText...
  • 华为honor机型,Toast组件不显示,我试过各种方式都不显示,其他厂商的机型都正常显示,就华为的不行,希望了解的朋友,帮忙解释下,这是什么原因,不胜感激。 解决方法: 通知是不是关闭了 设置 应用程序 ...
  • Toast不显示--hw

    2015-03-30 13:27:21
    华为竟然不显示Toast 在其他的机型都是可以显示,最后才知道华为的设置--应用程序管理---点击你的应用---会有显示通知的选择 选择后就显示Toast了。。。。0.0.。。。
  • 问题:部份机型不显示toast 解决方案: 1、自己在设置里面去允许通知,但是显然客户会说别的app都可以,so 2、自定义解决。查看toast的源码发现其附着在window上 源码下载地址:...
  • 最近项目中出现一个问题,就是有的手机在关闭系统通知,结果项目中使用的原生Toast在有的手机上竟然不显示了,然后就去查系统源码,发现原来原生的Toast是基于NotificaitionManagerService实现的,难怪有些手机...
  • Toast不显示的原因和在子线程中使用方法以及Looper类详细解析
  • 在网络变化时Toast一开始不显示信息,找了好久的错误才发现android.net.conn.CONNECTIVITY_CHANGE中的conn给写成了com 。。。。。。。。。。。
  • 根据患者头颅磁共振 T2 加权像所显示与症状相对应的最大梗死面积进行分型 大梗死:超过 1 个脑叶 5.0cm 以上, 中梗死:小于 1 个脑叶 3.1~5.0cm, 小梗死:1.6~3.0cm, 腔隙性脑梗死:小于 1.5cm。 2. 脑梗死 CT ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,783
精华内容 713
关键字:

toast不显示