解决部份机型toast不显示问题

问题:部份机型不显示toast

解决方案:

1、自己在设置里面去允许通知,但是显然客户会说别的app都可以,so

2、自定义解决。查看toast的源码发现其附着在window上

源码下载地址:https://github.com/AltasT/ToastSimple

原因:

某些机型需要去设置,某些机型阉割

源码:

package com.atlas.library.widget;

import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.PixelFormat;
import android.os.Build;
import android.os.Handler;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;

import com.atlas.library.R;

/**
 * Created by atlas on 15/4/25.
 * Email:[email protected]
 */
public class ToastUtils {
    private static final String TAG = ToastUtils.class.getSimpleName();
    private static TextView tv;
    public static final int LENGTH_LONG = 3500; // 3.5 seconds
    public static final int LENGTH_SHORT = 2000; // 2 seconds

    private static View mNextView;
    private static int mGravity, mX, mY;
    private static final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();
    private static WindowManager mWM;
    private static Handler mHanlder = new Handler();

    /**
     * init
     * @param context
     */
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
    private static void init(Context context) {
        mY = context.getResources().getDimensionPixelSize(
                R.dimen.toast_y_offset);
        mGravity = context.getResources().getInteger(
                R.integer.config_toastDefaultGravity);
        LayoutInflater inflate = (LayoutInflater)
                context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mNextView = inflate.inflate(R.layout.transient_notification, null);
        TextView tv = (TextView) mNextView.findViewById(android.R.id.message);

        mParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
        mParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
        mParams.format = PixelFormat.TRANSLUCENT;
        mParams.windowAnimations = 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;

        mWM = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        // We can resolve the Gravity here by using the Locale for getting
        // the layout direction
        final Configuration config = mNextView.getContext().getResources().getConfiguration();
        final int gravity = Gravity.getAbsoluteGravity(mGravity, config.getLayoutDirection());
        mParams.gravity = gravity;
        if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == Gravity.FILL_HORIZONTAL) {
            mParams.horizontalWeight = 1.0f;
        }
        if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.FILL_VERTICAL) {
            mParams.verticalWeight = 1.0f;
        }
        mParams.x = mX;
        mParams.y = mY;
//        mParams.verticalMargin = mVerticalMargin;
//        mParams.horizontalMargin = mHorizontalMargin;
        mParams.packageName = context.getPackageName();
    }

    /**
     * Show the view for the specified duration.
     * @param context
     * @param text
     * @param duration
     */
    public static void show(final Context context, final CharSequence text, int duration) {
        if (context == null) {
            throw new RuntimeException("context is null");
        }

        if (mWM == null || mNextView == null) {
            init(context);
        }
        mHanlder.removeCallbacks(cancelRunable);
        mHanlder.post(new Runnable() {
            @Override
            public void run() {
                ((TextView) mNextView.findViewById(android.R.id.message)).setText(text);
                if (mNextView.getParent() != null)
                    mWM.removeView(mNextView);
                mWM.addView(mNextView, mParams);
            }
        });
        mHanlder.postDelayed(cancelRunable, duration);
    }

    private static Runnable cancelRunable = new Runnable() {
        @Override
        public void run() {
            cancel();
        }
    };

    /**
     * cancel toast
     */
    public static void cancel() {
        if (mNextView != null && mNextView.getParent() != null)
            mWM.removeViewImmediate(mNextView);
    }
}

参考:http://www.th7.cn/Program/Android/201406/220638.shtml

时间: 2024-10-11 13:36:00

解决部份机型toast不显示问题的相关文章

Android 解决Toast一直显示个不停的问题

做程序的时候最常用的弹出大概就是Toast了.但有时候会发先一个特别尴尬的问题,就是:一旦你点击某个按钮次数多了,即使在程序退出后,Toast也弹个不停.什么原因造成的呢? 是这样的:我们为了方便,在写弹出Toast的时候通常使用的是Toast.makeText(this, "Toast测试", Toast.LENGTH_LONG).show();.弹出Toast过多恰恰就出现在这段代码本身.因为每调用一次这段代码程序就会重新创建一个Toast对象(Tost弹出的顺序是一个接一个的,也

Android widget] 华为honor toast不显示

华为honor机型,Toast组件不显示,我试过各种方式都不显示,其他厂商的机型都正常显示,就华为的不行,希望了解的朋友,帮忙解释下,这是什么原因,不胜感激. 解决方法: 通知是不是关闭了 设置 应用程序 找到你对应的程序 勾选显示通知 转:http://www.eoeandroid.com/thread-542297-1-1.html

Android Toast 重复显示问题

做程序员的,基本一看api就知道,用这个可以取消上一个toast的显示,然后显示下一个,这样就能解决出现的问题.可是在测试的过程中,发现却没有想象中的那么简单,不信可以百度一下,很多很多人发现toast的cancel()方法不起作用.还是不讲具体过程,只讲结果吧. 我把toast做成了一个应用类,方便使用,大家可以直接用: [java] view plaincopy public class ToastUtil { private static Handler handler = new Han

Android中通过反射来设置Toast的显示时间

这个Toast的显示在Android中的用途还是非常大的,同一时候我们也知道toast显示的时间是不可控的.我们仅仅能改动他的显示样式和显示的位置,尽管他提供了一个显示时间的设置方法.可是那是没有效果的(后面会说到).他有两个静态的常量Toast.SHORT和Toast.LONG,这个在后面我会在源码中看到这个两个时间事实上是2.5s和3s. 那么我们假设真想控制toast的显示时间该怎么办呢?真的是无计可施了吗?天无绝人之路,并且Linux之父以前说过:遇到问题就去看那个操蛋的源码吧.!以下就

解决Eclipse中C++代码显示Symbol 'std' could not be resolved的问题

第一次在Eclipse中写C++代码,写了一个简单的hello world程序,还没有等我编译.就报出了各种错误,但是这么简单的代码.怎么可能这么多错误.于是没有理会.编译执行后,能够正常输出!!!Hello World!!!,但是我的代码中还是有非常多红叉,把鼠标放在上面显示:Symbol 'std' could not be resolved 这种信息. 于是问题来了.怎样解决? 方法:写完库函数以后立刻保存.这样写之后的代码就不会报错了 比如:-->首先写#include <iostre

解决Sublime Text 3中文显示乱码问题(转)

解决Sublime Text 3中文显示乱码问题(转) 1.打开Sublime Text 3,按Ctrl+-打开控制行,复制粘贴以下python代码,然后回车运行. 2. 复制并粘贴如下代码: import urllib.request,os,hashlib; h = '7183a2d3e96f11eeadd761d777e62404e330c659d4bb41d3bdf022e94cab3cd0'; pf = 'Package Control.sublime-package'; ipp = s

一键解决ScrollView嵌套ListView仅仅显示一行的问题

/** * 解决ScrollView嵌套ListView仅仅显示一行的问题 * * @param listView */ private void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0;

在Toast里面显示图片

关于怎么在Toast里面显示图片,首先自定义一个toast,在自定义一个布局,这个布局你想让toast显示什么样的布局就定义什么样的,然后在自定的布局中放一个ImageView,在把自己自定义的布局塞到Toast里面,然后在调用自己自定义的Toast就可以了.这个是我做的,虽然比较难看能说明问题就行.一下是自定义toast代码:package com.rytong.toast; import android.app.Activity;import android.os.Bundle;import

解决 PHPExcel 长数字串显示为科学计数

解决 PHPExcel 长数字串显示为科学计数 https://github.com/PHPOffice/PHPExcel/ 在excel中如果在一个默认的格中输入或复制超长数字字符串,它会显示为科学计算法,例如身份证号码,解决方法是把表格设置文本格式或在输入前加一个单引号. 使用PHPExcel来生成excel,也会遇到同样的问题,解决方法有三种: 1.设置单元格为文本 $objPHPExcel = new PHPExcel(); $objPHPExcel->setActiveSheetInd