1. 程式人生 > >SnackbarUtilDemo【Snackbar的封裝類】

SnackbarUtilDemo【Snackbar的封裝類】

values 簡單 pan github 項目組 div sdk snackbar width

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

前言

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

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

效果圖

技術分享圖片

代碼分析

SnackbarUtil.java:Snackbar封裝類

使用步驟

一、項目組織結構圖

技術分享圖片

註意事項:

1、 導入類文件後需要change包名以及重新import R文件路徑

2、 Values目錄下的文件(strings.xml、dimens.xml、colors.xml等),如果項目中存在,則復制裏面的內容,不要整個覆蓋

二、導入步驟

1、在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‘
}

2、將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 = 0xfff44336; public static int green = 0xff4caf50; public static int blue = 0xff2195f3; public static int orange = 0xffffc107; /** * 短顯示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

三、使用方法

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

技術分享圖片
<?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類

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

SnackbarUtilDemo【Snackbar的封裝類】