工具類(lèi)之SnackbarUtils

Snackbar作為Android design support library下的一個(gè)控件嫡良,可以方便地在屏幕下方彈出消息秦驯,和Toast很相似揪罕,但更為靈活糙麦,這兩天也一直在為它的封裝搞事,因?yàn)橐婚_(kāi)始snackbar持有靜態(tài)變量導(dǎo)致內(nèi)存泄漏牌捷,現(xiàn)在已將其改為弱引用墙牌,完美解決其自動(dòng)回收,真是被自己雞汁到了暗甥;為了我的AndroidUtilCode庫(kù)中不compile其他庫(kù)喜滨,我不得不用provided com.android.support:design:xxx,但帶來(lái)的后果就是我需要把如下這三個(gè)東西抽出來(lái)撤防,真是煞費(fèi)苦心了我虽风,但是如果只是用我這單個(gè)工具類(lèi)的話那就直接Ctrl + C帶走即可,無(wú)需像我那般折騰寄月,老司機(jī)們只需直接compile com.android.support:design:xxx即可辜膝。

SnackbarXml

可自定義背景色和文字顏色及action按鈕的背景色和文字顏色,并可新增自定義view漾肮,是不是很爽厂抖,下面來(lái)展示下效果:

SnackbarDemo

下方展示其工具類(lèi)目錄及Demo地址和源碼:

showShortSnackbar      : 顯示短時(shí)snackbar
showLongSnackbar       : 顯示長(zhǎng)時(shí)snackbar
showIndefiniteSnackbar : 顯示自定義時(shí)長(zhǎng)snackbar
addView                : 為SnackBar添加布局
dismissSnackbar        : 取消snackbar顯示

import android.support.design.widget.Snackbar;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.blankj.utilcode.R;

import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;

/**
 * <pre>
 *     author: Blankj
 *     blog  : http://blankj.com
 *     time  : 2016/10/16
 *     desc  : Snackbar相關(guān)工具類(lèi)
 * </pre>
 */
public class SnackbarUtils {

    private SnackbarUtils() {
        throw new UnsupportedOperationException("u can't instantiate me...");
    }

    private static WeakReference<Snackbar> snackbarWeakReference;

    /**
     * 顯示短時(shí)snackbar
     *
     * @param parent    父視圖(CoordinatorLayout或者DecorView)
     * @param text      文本
     * @param textColor 文本顏色
     * @param bgColor   背景色
     */
    public static void showShortSnackbar(View parent, CharSequence text, int textColor, int bgColor) {
        showSnackbar(parent, text, Snackbar.LENGTH_SHORT, textColor, bgColor, null, -1, null);
    }

    /**
     * 顯示短時(shí)snackbar
     *
     * @param parent          父視圖(CoordinatorLayout或者DecorView)
     * @param text            文本
     * @param textColor       文本顏色
     * @param bgColor         背景色
     * @param actionText      事件文本
     * @param actionTextColor 事件文本顏色
     * @param listener        監(jiān)聽(tīng)器
     */
    public static void showShortSnackbar(View parent, CharSequence text, int textColor, int bgColor,
                                         CharSequence actionText, int actionTextColor, View.OnClickListener listener) {
        showSnackbar(parent, text, Snackbar.LENGTH_SHORT, textColor, bgColor,
                actionText, actionTextColor, listener);
    }

    /**
     * 顯示長(zhǎng)時(shí)snackbar
     *
     * @param parent    視圖(CoordinatorLayout或者DecorView)
     * @param text      文本
     * @param textColor 文本顏色
     * @param bgColor   背景色
     */
    public static void showLongSnackbar(View parent, CharSequence text, int textColor, int bgColor) {
        showSnackbar(parent, text, Snackbar.LENGTH_LONG, textColor, bgColor, null, -1, null);
    }

    /**
     * 顯示長(zhǎng)時(shí)snackbar
     *
     * @param parent          視圖(CoordinatorLayout或者DecorView)
     * @param text            文本
     * @param textColor       文本顏色
     * @param bgColor         背景色
     * @param actionText      事件文本
     * @param actionTextColor 事件文本顏色
     * @param listener        監(jiān)聽(tīng)器
     */
    public static void showLongSnackbar(View parent, CharSequence text, int textColor, int bgColor,
                                        CharSequence actionText, int actionTextColor, View.OnClickListener listener) {
        showSnackbar(parent, text, Snackbar.LENGTH_LONG, textColor, bgColor,
                actionText, actionTextColor, listener);
    }

    /**
     * 顯示自定義時(shí)長(zhǎng)snackbar
     *
     * @param parent    父視圖(CoordinatorLayout或者DecorView)
     * @param text      文本
     * @param duration  自定義時(shí)長(zhǎng)
     * @param textColor 文本顏色
     * @param bgColor   背景色
     */
    public static void showIndefiniteSnackbar(View parent, CharSequence text, int duration, int textColor, int bgColor) {
        showSnackbar(parent, text, duration, textColor, bgColor, null, -1, null);
    }

    /**
     * 顯示自定義時(shí)長(zhǎng)snackbar
     *
     * @param parent          父視圖(CoordinatorLayout或者DecorView)
     * @param text            文本
     * @param duration        自定義時(shí)長(zhǎng)
     * @param textColor       文本顏色
     * @param bgColor         背景色
     * @param actionText      事件文本
     * @param actionTextColor 事件文本顏色
     * @param listener        監(jiān)聽(tīng)器
     */
    public static void showIndefiniteSnackbar(View parent, CharSequence text, int duration, int textColor, int bgColor,
                                              CharSequence actionText, int actionTextColor, View.OnClickListener listener) {
        showSnackbar(parent, text, duration, textColor, bgColor,
                actionText, actionTextColor, listener);
    }

    /**
     * 設(shè)置snackbar文字和背景顏色
     *
     * @param parent          父視圖(CoordinatorLayout或者DecorView)
     * @param text            文本
     * @param duration        顯示時(shí)長(zhǎng)
     * @param textColor       文本顏色
     * @param bgColor         背景色
     * @param actionText      事件文本
     * @param actionTextColor 事件文本顏色
     * @param listener        監(jiān)聽(tīng)器
     */
    private static void showSnackbar(View parent, CharSequence text, int duration, int textColor, int bgColor,
                                     CharSequence actionText, int actionTextColor, View.OnClickListener listener) {
        switch (duration) {
            default:
            case Snackbar.LENGTH_SHORT:
            case Snackbar.LENGTH_LONG:
                snackbarWeakReference = new WeakReference<>(Snackbar.make(parent, text, duration));
                break;
            case Snackbar.LENGTH_INDEFINITE:
                snackbarWeakReference = new WeakReference<>(Snackbar.make(parent, text, Snackbar.LENGTH_INDEFINITE).setDuration(duration));
        }
        View view = snackbarWeakReference.get().getView();
        ((TextView) view.findViewById(R.id.snackbar_text)).setTextColor(textColor);
        view.setBackgroundColor(bgColor);
        if (actionText != null && actionText.length() > 0 && listener != null) {
            snackbarWeakReference.get().setActionTextColor(actionTextColor);
            snackbarWeakReference.get().setAction(actionText, listener);
        }
        snackbarWeakReference.get().show();
    }

    /**
     * 為snackbar添加布局
     * <p>在show...Snackbar之后調(diào)用</p>
     *
     * @param layoutId 布局文件
     * @param index    位置(the position at which to add the child or -1 to add last)
     */
    public static void addView(int layoutId, int index) {
        Snackbar snackbar = snackbarWeakReference.get();
        if (snackbar != null) {
            View view = snackbar.getView();
            Snackbar.SnackbarLayout layout = (Snackbar.SnackbarLayout) view;
            View child = LayoutInflater.from(view.getContext()).inflate(layoutId, null);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.WRAP_CONTENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT);
            params.gravity = Gravity.CENTER_VERTICAL;
            layout.addView(child, index, params);
        }
    }

    /**
     * 取消snackbar顯示
     */
    public static void dismissSnackbar() {
        if (snackbarWeakReference != null && snackbarWeakReference.get() != null) {
            snackbarWeakReference.get().dismiss();
            snackbarWeakReference = null;
        }
    }
}

如果該工具類(lèi)依賴其他工具類(lèi),都可以在我的Android開(kāi)發(fā)人員不得不收集的代碼(持續(xù)更新中)中找到初橘。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末验游,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子保檐,更是在濱河造成了極大的恐慌耕蝉,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夜只,死亡現(xiàn)場(chǎng)離奇詭異垒在,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)扔亥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)场躯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人旅挤,你說(shuō)我怎么就攤上這事踢关。” “怎么了粘茄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵签舞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我柒瓣,道長(zhǎng)儒搭,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任芙贫,我火速辦了婚禮搂鲫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘磺平。我一直安慰自己魂仍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布褪秀。 她就那樣靜靜地躺著蓄诽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪媒吗。 梳的紋絲不亂的頭發(fā)上仑氛,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音闸英,去河邊找鬼锯岖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛甫何,可吹牛的內(nèi)容都是我干的出吹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼辙喂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼捶牢!你這毒婦竟也來(lái)了鸠珠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤秋麸,失蹤者是張志新(化名)和其女友劉穎渐排,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體灸蟆,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驯耻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了炒考。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片可缚。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖斋枢,靈堂內(nèi)的尸體忽然破棺而出帘靡,到底是詐尸還是另有隱情,我是刑警寧澤瓤帚,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布测柠,位于F島的核電站,受9級(jí)特大地震影響缘滥,放射性物質(zhì)發(fā)生泄漏轰胁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一朝扼、第九天 我趴在偏房一處隱蔽的房頂上張望赃阀。 院中可真熱鬧,春花似錦擎颖、人聲如沸榛斯。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)驮俗。三九已至,卻和暖如春允跑,著一層夾襖步出監(jiān)牢的瞬間王凑,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工聋丝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留索烹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓弱睦,卻偏偏與公主長(zhǎng)得像百姓,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子况木,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,516評(píng)論 25 707
  • afinalAfinal是一個(gè)android的ioc垒拢,orm框架 https://github.com/yangf...
    passiontim閱讀 15,401評(píng)論 2 45
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,711評(píng)論 22 664
  • 1)用for in循環(huán)2)必須使用方括號(hào)的形式表示屬性
    從前慢pearl閱讀 181評(píng)論 0 0
  • 突然想寫(xiě)些文字旬迹,現(xiàn)在越來(lái)越缺失寫(xiě)文字的能力。確實(shí)求类,原創(chuàng)文字已經(jīng)越來(lái)越困難舱权,總喜歡抄襲,總喜歡借鑒仑嗅,到頭來(lái)沒(méi)有了自己...
    kforw閱讀 248評(píng)論 0 0