日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/10/12 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android自定义push通知_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:id="@+id/ll_push_content"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:background="@drawable/bg_push_message"

android:orientation="vertical">

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" />

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"/>

點九格式圖片:

使用方法:

activity中需要初始化一次:

PushToast.getInstance().init(this);

調用:

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

總結

以上是生活随笔為你收集整理的android自定义push通知_android通过自定义toast实现悬浮通知效果的示例代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。