大家都知道, 在安卓中, 有一个提醒用户的弹幕 , 就是吐司, 用来提示用户一些信息, 但是安卓中默认的吐司 样式太暗淡了, 好多小伙伴不喜欢,今天, 就带着大家一起打造个性化的吐司弹幕, Android Pie 中已经修复了吐司重复弹出的bug,所以针对9.0及以上的设备,不需要再使用静态吐司了... ,开始今天的代码
package com.ginkodrop.ihome.util;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Build;
import android.support.design.widget.Snackbar;
import android.support.v4.app.NotificationManagerCompat;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.ginkodrop.ihome.R;
/**
* Android Pie 中已经修复了吐司重复弹出的bug,
* 所以针对9.0及以上的设备,不需要再使用静态吐司了
*/
public class ToastUtil {
private static TextView mTextView;
private static Toast toastStart;
private static TextView snackbarTextView;
private static TextView snackbarActionView;
public static void showToast(Activity activity, String message) {
if (!Utils.isTopActivity(activity)) return;
if (!isNotifyEnable(activity)) {//如果通知权限被关闭,就是用替代方案
showSnackBar(activity, message);
return;
}
//加载Toast布局
View toastRoot = LayoutInflater.from(activity).inflate(R.layout.toast, null);
//初始化布局控件
mTextView = (TextView) toastRoot.findViewById(R.id.message);
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O_MR1) {
toastStart = new Toast(activity);
} else {
if (toastStart == null) {
toastStart = new Toast(activity);
}
}
mTextView.setText(message);
//获取屏幕高度
int height = activity.getResources().getDisplayMetrics().heightPixels;
//Toast的Y坐标是屏幕高度的1/3
toastStart.setGravity(Gravity.TOP, 0, (int) (height * 0.66));
toastStart.setDuration(Toast.LENGTH_LONG);
toastStart.setView(toastRoot);
toastStart.show();
}
@SuppressWarnings("deprecation")
public static void showToast(Activity activity, int message) {
if (!Utils.isTopActivity(activity)) return;
if (!isNotifyEnable(activity)) {
showSnackBar(activity, activity.getString(message));
return;
}
View toastRoot = LayoutInflater.from(activity).inflate(R.layout.toast, null);
mTextView = (TextView) toastRoot.findViewById(R.id.message);
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O_MR1) {
toastStart = new Toast(activity);
} else {
if (toastStart == null) {
toastStart = new Toast(activity);
}
}
mTextView.setText(activity.getResources().getString(message));
//获取屏幕高度
int height = activity.getResources().getDisplayMetrics().heightPixels;
//Toast的Y坐标是屏幕高度的1/3
toastStart.setGravity(Gravity.TOP, 0, (int) (height * 0.66));
toastStart.setDuration(Toast.LENGTH_LONG);
toastStart.setView(toastRoot);
toastStart.show();
}
//如果通知权限被关闭,就是用替代方案
public static void showSnackBar(Activity activity, String message) {
final Snackbar snackbar = Snackbar.make(activity.findViewById(android.R.id.content), message, Snackbar.LENGTH_SHORT);
snackbar.addCallback(new Snackbar.Callback() {
@Override
public void onShown(Snackbar sb) {
super.onShown(sb);
}
@Override
public void onDismissed(Snackbar transientBottomBar, int event) {
super.onDismissed(transientBottomBar, event);
}
})
.setAction("关闭", new View.OnClickListener() {
@Override
public void onClick(View v) {
snackbar.dismiss();
}
});
snackbarTextView = (TextView) snackbar.getView().findViewById(android.support.design.R.id.snackbar_text);
snackbarActionView = (TextView) snackbar.getView().findViewById(android.support.design.R.id.snackbar_action);
snackbarTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
snackbarActionView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
snackbarActionView.setTextColor(Color.WHITE);
snackbarTextView.setText(message);
snackbar.show();
}
private static boolean isNotifyEnable(Context context) {
return NotificationManagerCompat.from(context).areNotificationsEnabled();
}
}
下面是吐司现实的布局 item_toast_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv_toast_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/yellow_round_bg"
android:gravity="center"
android:paddingBottom="8dp"
android:paddingLeft="30dp"
android:paddingRight="30dp"
android:paddingTop="8dp"
android:textColor="@color/green" />
</LinearLayout>