安卓 自定義吐司樣式 ,適配Android Pie

大家都知道, 在安卓中, 有一個提醒用戶的彈幕 , 就是吐司, 用來提示用戶一些信息, 但是安卓中默認的吐司 樣式太暗淡了, 好多小夥伴不喜歡,今天, 就帶着大家一起打造個性化的吐司彈幕, 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>

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章