版權聲明:本文爲HaiyuKing原創文章,轉載請註明出處!java
這個工具類參考的是《沒時間解釋了,快使用Snackbar!——Android Snackbar花式使用指南》,代碼幾乎同樣,因此想要了解具體原理或者更詳細信息請閱讀參考資料。android
這裏只是作了一個簡單的記錄。git
在項目中究竟是使用Toast仍是Snackbar,能夠從這一方面考慮,Toast會顯示在輸入法鍵盤上方,Snackbar不會顯示在輸入法鍵盤上方(會被輸入法鍵盤遮擋住);github
SnackbarUtil.java:Snackbar封裝類app
注意事項:ide
一、 導入類文件後須要change包名以及從新import R文件路徑工具
二、 Values目錄下的文件(strings.xml、dimens.xml、colors.xml等),若是項目中存在,則複製裏面的內容,不要整個覆蓋佈局
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'
}
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); } }
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中使用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花式使用指南