SnackbarUtilDemo【Snackbar的封裝類】

版權聲明:本文爲HaiyuKing原創文章,轉載請註明出處!java

前言

這個工具類參考的是《沒時間解釋了,快使用Snackbar!——Android Snackbar花式使用指南》,代碼幾乎同樣,因此想要了解具體原理或者更詳細信息請閱讀參考資料。android

這裏只是作了一個簡單的記錄。git

在項目中究竟是使用Toast仍是Snackbar,能夠從這一方面考慮,Toast會顯示在輸入法鍵盤上方,Snackbar不會顯示在輸入法鍵盤上方(會被輸入法鍵盤遮擋住);github

效果圖

代碼分析

SnackbarUtil.java:Snackbar封裝類app

使用步驟

1、項目組織結構圖

注意事項:ide

一、  導入類文件後須要change包名以及從新import R文件路徑工具

二、  Values目錄下的文件(strings.xml、dimens.xml、colors.xml等),若是項目中存在,則複製裏面的內容,不要整個覆蓋佈局

2、導入步驟

一、在build.gradle中引入design支持庫【版本號跟appcompat保持一致】

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.why.project.snackbarutildemo"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    //引入design庫 implementation 'com.android.support:design:28.0.0'
}

二、將SnackbarUtil複製到項目中

package com.why.project.snackbarutildemo.utils;

import android.graphics.Color;
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.why.project.snackbarutildemo.R;

/**
 * Used Snackbar封裝類
 * https://www.jianshu.com/p/cd1e80e64311
 */
public class SnackbarUtil {

    public static final int Info = 1;//普通提示
    public static final int Confirm = 2;//成功提示
    public static final int Warning = 3;//警告提示
    public static final int Alert = 4;//錯誤提示


    public static int red = 0xffFE4949;//紅色錯誤提示:原方案-f44336
    public static int green = 0xffa1c45a;//綠色成功提示:原方案-4caf50
    public static int blue = 0xff54B0FF;//藍色普通提示:原方案-2195f3
    public static int orange = 0xffFF8438;//橙色警告提示:原方案-ffc107

    /**
     * 短顯示Snackbar,自定義顏色
     * @param view
     * @param message
     * @param messageColor
     * @param backgroundColor
     * @return
     */
    public static Snackbar ShortSnackbar(View view, String message, int messageColor, int backgroundColor){
        Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_SHORT);// 短期顯示,而後自動取消
        setSnackbarColor(snackbar,messageColor,backgroundColor);
        return snackbar;
    }

    /**
     * 長顯示Snackbar,自定義顏色
     * @param view
     * @param message
     * @param messageColor
     * @param backgroundColor
     * @return
     */
    public static Snackbar LongSnackbar(View view, String message, int messageColor, int backgroundColor){
        Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_LONG);// 長時間顯示,而後自動取消
        setSnackbarColor(snackbar,messageColor,backgroundColor);
        return snackbar;
    }

    /**
     * 自定義時常顯示Snackbar,自定義顏色
     * @param view
     * @param message
     * @param messageColor
     * @param backgroundColor
     * @return
     */
    public static Snackbar IndefiniteSnackbar(View view, String message,int duration,int messageColor, int backgroundColor){
        Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_INDEFINITE).setDuration(duration);// 不消失顯示,除非手動取消
        setSnackbarColor(snackbar,messageColor,backgroundColor);
        return snackbar;
    }

    /**
     * 短顯示Snackbar,可選預設類型
     * @param view
     * @param message
     * @param type
     * @return
     */
    public static Snackbar ShortSnackbar(View view, String message, int type){
        Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_SHORT);// 短期顯示,而後自動取消
        switchType(snackbar,type);
        return snackbar;
    }

    /**
     * 長顯示Snackbar,可選預設類型
     * @param view
     * @param message
     * @param type
     * @return
     */
    public static Snackbar LongSnackbar(View view, String message,int type){
        Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_LONG);// 長時間顯示,而後自動取消
        switchType(snackbar,type);
        return snackbar;
    }

    /**
     * 自定義時常顯示Snackbar,可選預設類型
     * @param view
     * @param message
     * @param type
     * @return
     */
    public static Snackbar IndefiniteSnackbar(View view, String message,int duration,int type){
        Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_INDEFINITE).setDuration(duration);// 不消失顯示,除非手動取消
        switchType(snackbar,type);
        return snackbar;
    }

    //選擇預設類型
    private static void switchType(Snackbar snackbar,int type){
        switch (type){
            case Info:
                setSnackbarColor(snackbar,blue);
                break;
            case Confirm:
                setSnackbarColor(snackbar,green);
                break;
            case Warning:
                setSnackbarColor(snackbar,orange);
                break;
            case Alert:
                setSnackbarColor(snackbar,Color.YELLOW,red);
                break;
        }
    }

    /**
     * 設置Snackbar背景顏色
     * @param snackbar
     * @param backgroundColor
     */
    public static void setSnackbarColor(Snackbar snackbar, int backgroundColor) {
        View view = snackbar.getView();
        if(view!=null){
            view.setBackgroundColor(backgroundColor);
        }
    }

    /**
     * 設置Snackbar文字和背景顏色
     * @param snackbar
     * @param messageColor
     * @param backgroundColor
     */
    public static void setSnackbarColor(Snackbar snackbar, int messageColor, int backgroundColor) {
        View view = snackbar.getView();
        if(view!=null){
            view.setBackgroundColor(backgroundColor);
            ((TextView) view.findViewById(R.id.snackbar_text)).setTextColor(messageColor);
        }
    }

    /**
     * 向Snackbar中添加view【用於添加圖標】【Google不建議】
     * @param snackbar
     * @param layoutId
     * @param index 新加布局在Snackbar中的位置
     */
    public static void SnackbarAddView( Snackbar snackbar,int layoutId,int index) {
        View snackbarview = snackbar.getView();
        Snackbar.SnackbarLayout snackbarLayout=(Snackbar.SnackbarLayout)snackbarview;

        View add_view = LayoutInflater.from(snackbarview.getContext()).inflate(layoutId,null);

        LinearLayout.LayoutParams p = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
        p.gravity= Gravity.CENTER_VERTICAL;

        snackbarLayout.addView(add_view,index,p);
    }
}
SnackbarUtil.java

3、使用方法

activity_main.xml佈局文件(其實沒有重要代碼)gradle

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn_info"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="彈出Info類型的Snackbar"
        android:layout_margin="10dp"/>

    <Button
        android:id="@+id/btn_confirm"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="彈出Confirm類型的Snackbar"
        android:layout_margin="10dp"/>

    <Button
        android:id="@+id/btn_warning"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="彈出Warning類型的Snackbar"
        android:layout_margin="10dp"/>

    <Button
        android:id="@+id/btn_alert"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="彈出Alert類型的Snackbar"
        android:layout_margin="10dp"/>

</LinearLayout>
activity_main.xml

在Activity中使用SnackbarUtil.java類ui

package com.why.project.snackbarutildemo;

import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.why.project.snackbarutildemo.utils.SnackbarUtil;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ((Button)findViewById(R.id.btn_info)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                /*這個view是有講究的——咱們傳入的view通過了findSuitableParent()方法的包裝。
                1.當傳入的View不爲空時,若是咱們在佈局中發現了CoordinatorLayout佈局,那麼View就是CoordinatorLayout;
                2.若是沒有CoordinatorLayout佈局,咱們就先找到一個id爲android.R.id.content的FrameLayout(這個佈局是最底層的根佈局),將View設置爲該FrameLayout;
                3.其餘狀況下就使用View的Parent佈局,一直到這個View不爲空。*/ SnackbarUtil.ShortSnackbar(view,"已超出範圍,請從新選擇",SnackbarUtil.Info).show();
            }
        });

        ((Button)findViewById(R.id.btn_confirm)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                /*這個view是有講究的——咱們傳入的view通過了findSuitableParent()方法的包裝。
                1.當傳入的View不爲空時,若是咱們在佈局中發現了CoordinatorLayout佈局,那麼View就是CoordinatorLayout;
                2.若是沒有CoordinatorLayout佈局,咱們就先找到一個id爲android.R.id.content的FrameLayout(這個佈局是最底層的根佈局),將View設置爲該FrameLayout;
                3.其餘狀況下就使用View的Parent佈局,一直到這個View不爲空。*/ SnackbarUtil.ShortSnackbar(view,"保存成功",SnackbarUtil.Confirm).show();
            }
        });

        ((Button)findViewById(R.id.btn_warning)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                /*這個view是有講究的——咱們傳入的view通過了findSuitableParent()方法的包裝。
                1.當傳入的View不爲空時,若是咱們在佈局中發現了CoordinatorLayout佈局,那麼View就是CoordinatorLayout;
                2.若是沒有CoordinatorLayout佈局,咱們就先找到一個id爲android.R.id.content的FrameLayout(這個佈局是最底層的根佈局),將View設置爲該FrameLayout;
                3.其餘狀況下就使用View的Parent佈局,一直到這個View不爲空。*/ SnackbarUtil.ShortSnackbar(view,"標題不能爲空",SnackbarUtil.Warning).show();
            }
        });

        ((Button)findViewById(R.id.btn_alert)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                /*這個view是有講究的——咱們傳入的view通過了findSuitableParent()方法的包裝。
                1.當傳入的View不爲空時,若是咱們在佈局中發現了CoordinatorLayout佈局,那麼View就是CoordinatorLayout;
                2.若是沒有CoordinatorLayout佈局,咱們就先找到一個id爲android.R.id.content的FrameLayout(這個佈局是最底層的根佈局),將View設置爲該FrameLayout;
                3.其餘狀況下就使用View的Parent佈局,一直到這個View不爲空。*/ SnackbarUtil.ShortSnackbar(view,"保存失敗",SnackbarUtil.Alert).setAction("重試", new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(MainActivity.this,"重試",Toast.LENGTH_SHORT).show(); } }).setActionTextColor(Color.parseColor("#ffffff")).show();
            }
        });
    }
}

混淆配置

參考資料

沒時間解釋了,快使用Snackbar!——Android Snackbar花式使用指南

SnackbarUtils:一行代碼搞定Snackbar

Design庫-SnackBar屬性詳解

項目demo下載地址

https://github.com/haiyuKing/SnackbarUtilDemo

相關文章
相關標籤/搜索