SnackbarUtilDemo【Snackbar的封裝類】
阿新 • • 發佈:2018-10-05
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; importSnackbarUtil.javaandroid.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); } }
三、使用方法
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的封裝類】