当前位置: 移动技术网 > IT编程>移动开发>Android > android通过自定义toast实现悬浮通知效果的示例代码

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

2019年08月02日  | 移动技术网IT编程  | 我要评论

公务员xiaok玩网络赌博游戏,绝对死亡游戏无弹窗,藏獒vs狼

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<string,string> 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布局:

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll_push_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_push_message"
android:orientation="vertical">
<textview
 android:id="@+id/tv_title"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:textcolor="@color/black"
 android:text="标题"
 android:maxlines="2"
 android:ellipsize="end"
 android:textstyle="bold"
 android:textsize="@dimen/text_size_14" />
<textview
 android:id="@+id/tv_content"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:textcolor="@color/black_808080"
 android:textsize="@dimen/text_size_13"
 android:maxlines="3"
 android:ellipsize="end"
 android:layout_margintop="@dimen/margin_large"
 android:text="1"/>

</linearlayout>

点九格式图片:

使用方法:

activity中需要初始化一次:

pushtoast.getinstance().init(this);

调用:

pushtoast.getinstance().createtoast(msg.title,msg.text,umengpushentity.getextramap());

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网