国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android中Snackbar的使用方法及小技巧

2019-10-22 18:13:24
字體:
供稿:網(wǎng)友

前言

Snackbar和Toast相似,都是為了給用戶提供交互信息,Snackbar是固定在底部的,顯示時(shí)從下往上滑出

android,snackbar使用,snackbar,android的snackbar

要使用Snackbar,需要在項(xiàng)目的build.gradle中添加依賴

dependencies { compile 'com.android/299833.html">android.support:design:23.4.0'}

Snackbar的使用方法和Toast很相似

Snackbar.make(mOpenTv, "消息內(nèi)容", Snackbar.LENGTH_SHORT)  .setAction("確定", new View.OnClickListener() {  @Override  public void onClick(View v) {  }  })  .show();

第一個(gè)參數(shù)需要傳入一個(gè)View,可以是界面當(dāng)中的任意一個(gè)View控件,Snackbar會(huì)自動(dòng)根據(jù)這個(gè)控件找到最外層的布局來顯示

第二個(gè)參數(shù)就是我們需要顯示的內(nèi)容,注意這里的內(nèi)容最多顯示兩行哦,超出兩行后的內(nèi)容會(huì)變成“…”

第三個(gè)參數(shù)為Snackbar顯示的時(shí)長,有三種模式供選擇

  • LENGTH_SHORT:短時(shí)間顯示
  • LENGTH_LONG:長時(shí)間顯示
  • LENGTH_INDEFINITE:一直顯示,只有當(dāng)用戶觸發(fā)Action點(diǎn)擊事件或手動(dòng)刪除時(shí)才會(huì)消失

Snackbar可以通過setAction方法設(shè)置一個(gè)點(diǎn)擊事件,和用戶進(jìn)行交互

我們還可以通過setCallback方法來監(jiān)聽Snackbar的顯示和關(guān)閉

 Snackbar sb = Snackbar.make(mOpenTv, "消息內(nèi)容", Snackbar.LENGTH_SHORT); sb.setCallback(new Snackbar.Callback() { @Override public void onDismissed(Snackbar snackbar, int event) { super.onDismissed(snackbar, event); // Snackbar關(guān)閉時(shí)回調(diào) } @Override public void onShown(Snackbar snackbar) { super.onShown(snackbar); // Snackbar打開時(shí)回調(diào) } }); sb.show();

Snackbar還支持滑出刪除,需要在布局文件中使用CoordinatorLayout作為根布局

android,snackbar使用,snackbar,android的snackbar

建議要使用Snackbar的時(shí)候最好是以CoordinatorLayout作為根布局,如果以其它RelativeLayout,LinearLayout等作為根布局的話,會(huì)出現(xiàn)以下這種情況

android,snackbar使用,snackbar,android的snackbar

FloatingActionButton被遮到了,使用CoordinatorLayout作為根布局可以避免這種情況

android,snackbar使用,snackbar,android的snackbar

Snackbar只能在底部顯示嗎?

是也不是,為啥這么說呢,Snackbar確實(shí)是在CoordinatorLayout底部顯示的,但并不等于是在屏幕頂部

首先我們要知道Snackbar顯示的原理是什么

之前介紹中的第一個(gè)傳進(jìn)去的參數(shù)View,Snackbar會(huì)通過這個(gè)View控件找到它所在的根布局,我們來查看下源碼

 public static Snackbar make(@NonNull View view, @NonNull CharSequence text,  @Duration int duration) { Snackbar snackbar = new Snackbar(findSuitableParent(view)); snackbar.setText(text); snackbar.setDuration(duration); return snackbar; }

我們傳進(jìn)去的view會(huì)經(jīng)過findSuitableParent方法的處理,我們?cè)賮砜聪逻@個(gè)方法的具體實(shí)現(xiàn)

 private static ViewGroup findSuitableParent(View view) { ViewGroup fallback = null; do {  if (view instanceof CoordinatorLayout) {  // We've found a CoordinatorLayout, use it  return (ViewGroup) view;  } else if (view instanceof FrameLayout) {  if (view.getId() == android.R.id.content) {   // If we've hit the decor content view, then we didn't find a CoL in the   // hierarchy, so use it.   return (ViewGroup) view;  } else {   // It's not the content view but we'll use it as our fallback   fallback = (ViewGroup) view;  }  }  if (view != null) {  // Else, we will loop and crawl up the view hierarchy and try to find a parent  final ViewParent parent = view.getParent();  view = parent instanceof View ? (View) parent : null;  } } while (view != null); // If we reach here then we didn't find a CoL or a suitable content view so we'll fallback return fallback; }

詳細(xì)的過程google的工程師已經(jīng)寫的非常的清楚了,我們主要需要了解的就是當(dāng)一個(gè)View的直接父布局為CoordinatorLayout時(shí),就以這個(gè)CoordinatorLayout為標(biāo)準(zhǔn)來顯示Snackbar

我們可以做個(gè)小實(shí)驗(yàn)驗(yàn)證一下

在傳入的View控件外面套一層CoordinatorLayout

 <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="100dp"> <TextView  android:id="@+id/tv_open_snackbar"  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:gravity="center"  android:text="打開Snackbar"  android:textSize="28sp"/> </android.support.design.widget.CoordinatorLayout>

再運(yùn)行一下看看,效果就變成了下面這樣

android,snackbar使用,snackbar,android的snackbar

所以說Snackbar的顯示位置還是可以通過這個(gè)小技巧來改變的

如果嫌默認(rèn)的Snackbar太丑怎么辦?

我們可以來自定義它的外觀

1.改變按鈕的文字顏色

通過調(diào)用setActionTextColor方法即可改變按鈕的文字顏色

 Snackbar sb = Snackbar.make(mOpenTv, "消息內(nèi)容", Snackbar.LENGTH_SHORT); sb.setAction("確定", new View.OnClickListener() {  @Override  public void onClick(View v) {  } }); sb.setActionTextColor(Color.YELLOW); sb.show();

android,snackbar使用,snackbar,android的snackbar

2.改變消息內(nèi)容的文字顏色

Snackbar沒有給我們提供改變消息文本顏色的api接口,但在查看源碼時(shí)發(fā)現(xiàn)了這個(gè)方法getView

 /** * Returns the {@link Snackbar}'s view. */ @NonNull public View getView() { return mView; }

這里返回的mView其實(shí)是一個(gè)SnackbarLayout布局,在SnackbarLayout的構(gòu)造方法中找到了它的布局文件design_layout_snackbar_include

  // Now inflate our content. We need to do this manually rather than using an <include>  // in the layout since older versions of the Android do not inflate includes with  // the correct Context.  LayoutInflater.from(context).inflate(R.layout.design_layout_snackbar_include, this);

design_layout_snackbar_include布局文件里只有兩個(gè)控件,一個(gè)TextView,一個(gè)Button

<merge xmlns:android="http://schemas.android.com/apk/res/android"> <TextView  android:id="@+id/snackbar_text"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:layout_weight="1"  android:paddingTop="@dimen/design_snackbar_padding_vertical"  android:paddingBottom="@dimen/design_snackbar_padding_vertical"  android:paddingLeft="@dimen/design_snackbar_padding_horizontal"  android:paddingRight="@dimen/design_snackbar_padding_horizontal"  android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"  android:maxLines="@integer/design_snackbar_text_max_lines"  android:layout_gravity="center_vertical|left|start"  android:ellipsize="end"  android:textAlignment="viewStart"/> <Button  android:id="@+id/snackbar_action"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:layout_marginLeft="@dimen/design_snackbar_extra_spacing_horizontal"  android:layout_marginStart="@dimen/design_snackbar_extra_spacing_horizontal"  android:layout_gravity="center_vertical|right|end"  android:paddingTop="@dimen/design_snackbar_padding_vertical"  android:paddingBottom="@dimen/design_snackbar_padding_vertical"  android:paddingLeft="@dimen/design_snackbar_padding_horizontal"  android:paddingRight="@dimen/design_snackbar_padding_horizontal"  android:visibility="gone"  android:textColor="?attr/colorAccent"  style="?attr/borderlessButtonStyle"/></merge>

相信看到這里大家應(yīng)該知道怎么做了,TextView的id為snackbar_text,我們通過getView()來獲取這個(gè)TextView控件

 Snackbar sb = Snackbar.make(mOpenTv, "消息內(nèi)容", Snackbar.LENGTH_SHORT); sb.setAction("確定", new View.OnClickListener() {  @Override  public void onClick(View v) {  } }); sb.setActionTextColor(Color.YELLOW); View view = sb.getView(); TextView tv = (TextView) view.findViewById(R.id.snackbar_text); tv.setTextColor(Color.RED); sb.show();

android,snackbar使用,snackbar,android的snackbar

同樣的,我們也可以通過tv.setTextSize設(shè)置它的文字大小

3.改變消息內(nèi)容的背景

同理,根據(jù)以上方法,得到它的布局,調(diào)用對(duì)應(yīng)的api接口就好

  View view = sb.getView();  view.setBackgroundColor(Color.RED);

像這種紅紅的給用戶警告的提示,是不是比Toast要來的炫酷多了呢

android,snackbar使用,snackbar,android的snackbar

android,snackbar使用,snackbar,android的snackbar

4.給消息內(nèi)容添加圖標(biāo)

獲取到消息內(nèi)容的TextView后,調(diào)用setCompoundDrawables方法設(shè)置它的圖標(biāo),可自由選擇圖標(biāo)放置的位置,四個(gè)參數(shù)分別對(duì)應(yīng)TextView的左、上、右、下

  Snackbar sb = Snackbar.make(mOpenTv, "消息內(nèi)容", Snackbar.LENGTH_SHORT);  sb.setAction("確定", new View.OnClickListener() {   @Override   public void onClick(View v) {   }  });  sb.setActionTextColor(Color.YELLOW);  View view = sb.getView();  TextView tv = (TextView) view.findViewById(R.id.snackbar_text);  Drawable d = ContextCompat.getDrawable(this, R.drawable.warn);  d.setBounds(0, 0, d.getMinimumWidth(), d.getMinimumHeight());  tv.setCompoundDrawables(d, null, null, null); // 給TextView左邊添加圖標(biāo)  tv.setGravity(Gravity.CENTER); // 讓文字居中  sb.show(); }

android,snackbar使用,snackbar,android的snackbar

注意要設(shè)置setGravity使其居中,不然文字默認(rèn)在上面不好看啊

就先介紹這么多,其實(shí)只要拿到了它的布局,接下來怎么整就看各位的喜好啦

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到Android開發(fā)頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 克山县| 孝昌县| 桦甸市| 策勒县| 襄垣县| 大悟县| 栖霞市| 宁波市| 阳朔县| 商南县| 仪陇县| 太白县| 溆浦县| 开封县| 牙克石市| 怀来县| 凤山县| 白水县| 兴化市| 姜堰市| 益阳市| 四会市| 商河县| 张家口市| 苍梧县| 丹阳市| 栖霞市| 万州区| 临泽县| 闽清县| 金湖县| 云林县| 阳朔县| 宣恩县| 宁海县| 繁峙县| 新巴尔虎左旗| 婺源县| 台中县| 睢宁县| 沅江市|