• <sup id="6cuck"><object id="6cuck"></object></sup>
  • 一聚教程网:一个值得你收藏的教程网站

    最新下载

    android通过自定义toast实现悬浮通知效果的示例代码

    时间:2018-10-19 15:17:01 编辑:猪哥 来源:转载

    android通过toast实现悬浮通知效果,如图:

    android通过自定义toast实现悬浮通知效果的示例代码

    实现的功能:

    •  自定义悬浮弹窗;
    • 点击其他地方该布局不受影响;
    • 可自定义显示时间;
    • 可以设置点击事件;

    代码如下:

    import android.content.Context;
    import android.os.Build;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.view.Gravity;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.WindowManager;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    import android.widget.Toast;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.Map;
    import cn.droidlover.xdroidmvp.router.Router;
    import io.slife.wallet.R;
    import io.slife.wallet.config.IntentKey;
    import io.slife.wallet.ui.NewsFlashDetailActivity;
    
    public class PushToast {
    private AppCompatActivity mActivity;
    private static PushToast mInstance;
    private Toast mToast;
    private final int SHOW = 1;
    private final int HIDE = 0;
    private Object mTN;
    private Method mShow;
    private Method mHide;
    private Field mViewFeild;
    private long durationTime = 5*1000;
    
    public static PushToast getInstance() {
     if (mInstance == null) {
      mInstance = new PushToast();
     }
     return mInstance;
    }
    
    public void init(AppCompatActivity activity) {
     mActivity = activity;
    }
    
    public void createToast(String title, String content, Map params) {
     if (mActivity == null) {
      return;
     }
     LayoutInflater inflater = mActivity.getLayoutInflater();//调用Activity的getLayoutInflater()
    //  LayoutInflater inflater = (LayoutInflater) context.getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
     View view = inflater.inflate(R.layout.view_push_toast, null); //加載layout下的布局
     LinearLayout llPushContent = (LinearLayout) view.findViewById(R.id.ll_push_content);
     TextView tvTitle = (TextView) view.findViewById(R.id.tv_title);
     TextView tvContent = (TextView) view.findViewById(R.id.tv_content);
     tvTitle.setText(title);
     tvContent.setText(content);
     mToast = new Toast(mActivity);
     mToast.setView(view);
     mToast.setDuration(Toast.LENGTH_LONG);
     mToast.setGravity(Gravity.TOP, 0, 0);
     reflectEnableClick();
     reflectToast();
     llPushContent.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
       String newsFlashId = params.get("InformationID");
       Router.newIntent(mActivity).to(NewsFlashDetailActivity.class).putString(IntentKey.NEWS_FLASH_ID,newsFlashId).launch();
       handler.sendEmptyMessage(HIDE);
      }
     });
     if(mShow != null && mHide != null){
      handler.sendEmptyMessage(SHOW);
     }else{
      mToast.show();
     }
    }
    
    private void reflectEnableClick() {
     try {
      Object mTN;
      mTN = getField(mToast, "mTN");
      if (mTN != null) {
       Object mParams = getField(mTN, "mParams");
       if (mParams != null
         && mParams instanceof WindowManager.LayoutParams) {
        WindowManager.LayoutParams params = (WindowManager.LayoutParams) mParams;
        //显示与隐藏动画
    //     params.windowAnimations = R.style.ClickToast;
        //Toast可点击
        params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
          | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
        //设置viewgroup宽高
        params.width = WindowManager.LayoutParams.MATCH_PARENT; //设置Toast宽度为屏幕宽度
        params.height = WindowManager.LayoutParams.WRAP_CONTENT; //设置高度
       }
      }
     } catch (Exception e) {
      e.printStackTrace();
     }
    }
    
    /**
     * 反射字段
     *
     * @param object 要反射的对象
     * @param fieldName 要反射的字段名称
     */
    private static Object getField(Object object, String fieldName)
      throws NoSuchFieldException, IllegalAccessException {
     Field field = object.getClass().getDeclaredField(fieldName);
     if (field != null) {
      field.setAccessible(true);
      return field.get(object);
     }
     return null;
    }
    
    private Handler handler = new Handler() {
     @Override
     public void handleMessage(Message msg) {
      super.handleMessage(msg);
      switch (msg.what) {
       case SHOW:
        handler.sendEmptyMessageDelayed(HIDE, durationTime);
        show();
        break;
       case HIDE:
        hide();
        break;
      }
     }
    };
    
    public void reflectToast() {
     Field field = null;
     try {
      field = mToast.getClass().getDeclaredField("mTN");
      field.setAccessible(true);
      mTN = field.get(mToast);
      mShow = mTN.getClass().getDeclaredMethod("show");
      mHide = mTN.getClass().getDeclaredMethod("hide");
      mViewFeild = mTN.getClass().getDeclaredField("mNextView");
      mViewFeild.setAccessible(true);
     } catch (NoSuchFieldException e) {
      e.printStackTrace();
     } catch (IllegalAccessException e) {
      e.printStackTrace();
     } catch (IllegalArgumentException e) {
      e.printStackTrace();
     } catch (NoSuchMethodException e1) {
      e1.printStackTrace();
     }
    }
    
    public void show() {
     try {
      //android4.0以上就要以下处理
      if (Build.VERSION.SDK_INT > 14) {
       Field mNextViewField = mTN.getClass().getDeclaredField("mNextView");
       mNextViewField.setAccessible(true);
       LayoutInflater inflate = (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
       View v = mToast.getView();
       mNextViewField.set(mTN, v);
       Method method = mTN.getClass().getDeclaredMethod("show", null);
       method.invoke(mTN, null);
      }
      mShow.invoke(mTN, null);
     } catch (Exception e) {
      e.printStackTrace();
     }
    }
    
    private void hide() {
     try {
      mHide.invoke(mTN, null);
     } catch (IllegalAccessException e) {
      e.printStackTrace();
     } catch (IllegalArgumentException e) {
      e.printStackTrace();
     } catch (InvocationTargetException e) {
      e.printStackTrace();
     }catch (NullPointerException ex){
      ex.printStackTrace();
     }
    }
    }

    xml布局:

    
    
    
    
    
    

    点九格式图片:

    android通过自定义toast实现悬浮通知效果的示例代码

    使用方法:

    activity中需要初始化一次:

    PushToast.getInstance().init(this);

    调用:

    PushToast.getInstance().createToast(msg.title,msg.text,umengPushEntity.getExtraMap());

    文章评论

    热门栏目

    65期玄机挂牌资料 铜鼓县| 万安县| 定州市| 兴安县| 陆良县| 尼勒克县| 陈巴尔虎旗| 莱阳市| 崇文区| 英超| 山西省| 方正县| 敖汉旗| 彭泽县| 玛沁县| 广宁县| 溆浦县| 浙江省| 当阳市| 鞍山市| 垫江县| 资溪县| 彰化县| 合作市| 乌鲁木齐市| 恩施市| http://www.wpbgmt.cn 吉木萨尔县| 满城县| 新干县| 金昌市| 丹江口市| 突泉县| 中宁县| 郓城县| 大姚县| 砀山县| 明光市| 江山市| 祁连县| 司法| 武夷山市| 榆林市| 芮城县| 富锦市| 兴安县| 双牌县| 阿荣旗| 城步| 普宁市| 芷江| 交城县| 长宁区| 高安市| 漳平市| 华宁县| http://Lionev.cn 墨竹工卡县| 江阴市| 泗水县| 英德市| 罗源县| 观塘区| 江西省| 饶阳县| 泽库县| 枞阳县| 灯塔市| 新河县| 修水县| 敦煌市| 邹平县| 措美县| 宝应县| 于田县| 秭归县| 广丰县| 咸丰县| 麻城市| 木兰县| 集贤县| 普兰县| 顺平县| 城市| 曲麻莱县| 阿荣旗| 六盘水市| 循化| 濮阳市| 门头沟区| 福清市| http://www.kLbysy.cn 卢湾区| 南木林县| 新绛县| 上栗县| 江川县| 高尔夫| 手游| 武功县| 磐石市| 洛隆县| 辉南县| 木兰县| 延川县| 定远县| 拜泉县| 德昌县| 南城县| 南充市| 江川县| 大冶市| 浠水县| 山丹县| 沐川县| 依安县| 四川省| 双江| 五家渠市| 高要市| 阳高县| http://www.qqsjnb.cn 普定县| 慈溪市| 孟州市| 察隅县| 龙陵县| 达孜县| 牟定县| 武乡县| 健康| 安吉县| 伊金霍洛旗| 华蓥市| 贵定县| 南城县| 石泉县| 金阳县| 郑州市| 大同县| 江安县| 江都市| 嵩明县| 桑植县| 双辽市| 衡阳县| 丹东市| 越西县| 台湾省| 巩留县| 台湾省| http://www.hpymqn.cn 锦屏县| 定西市| 台东县| 哈密市| 蓝田县| 长宁县| 肇庆市| 灵寿县| 扶风县| 济南市| 隆子县| 通河县| 梁平县| 垦利县| 手游| 淮北市| 大理市| 军事| 屯昌县| 青冈县| 太和县| 来宾市| 陆良县| 彰化县| 镇原县| 岳普湖县| 金塔县| 镇宁| http://kjoofc.cn 鸡泽县| 伊通| 丰都县| 常州市| 宁河县| 扶沟县| 广汉市| 肇源县| 龙里县| 焦作市| 正镶白旗| 垣曲县| 镇巴县| 柘荣县| 遂宁市| 凤山县| 定陶县|