java.lang.Object
↳ android.support.design.widget.Snackbar
类似于Toast,Snackbar提供一个轻量级的操作反馈。在手机底部显示一个简短的信息。经过一段时间自动消失。
可以通过setAction(CharSequence, android.view.View.OnClickListener)
操作Snackbar。
Snackbar的源码还比较简单,有兴趣可以去看下。
Snackbar mySnackbar = Snackbar.make(findViewById(R.id.myCoordinatorLayout),
R.string.email_archived, Snackbar.LENGTH_SHORT);
mySnackbar.setAction(R.string.undo_string, new MyUndoListener());
mySnackbar.show();
public class MyUndoListener implements View.OnClickListener{
&Override
public void onClick(View v) {
// Code to undo the user's last action
}
}
注意:
setDuration既可以是LENGTH_SHORT
,也可以是LENGTH_LONG
,还可以自定义毫秒数。
/**
* Update the text in this {@link Snackbar}.
*
* @param resId The new text for the Toast.
*/
@NonNull
public Snackbar setText(@StringRes int resId) {
return setText(mContext.getText(resId));
}
/**
* Set how long to show the view for.
*
* @param duration either be one of the predefined lengths:
* {@link #LENGTH_SHORT}, {@link #LENGTH_LONG}, or a custom duration
* in milliseconds.
*/
@NonNull
public Snackbar setDuration(@Duration int duration) {
mDuration = duration;
return this;
}
Snackbar的布局:
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2015 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<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"/>
<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>
在API中提供了setActionTextColor
方法设置按钮的颜色,如果想设置文本提示的颜色呢?API没提供,但是我们知道Snackbar的布局文件,我们可以通过snackbar.getView()找到那个Snackbar的布局。
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar snackbar = Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_INDEFINITE)
.setAction("Action", new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}).setActionTextColor(Color.WHITE).setCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar snackbar, int event) {
super.onDismissed(snackbar, event);
Log.d(TAG, "onDismissed");
}
@Override
public void onShown(Snackbar snackbar) {
super.onShown(snackbar);
Log.d(TAG, "onShown");
}
}).setText("haha");
View snackBarView = snackbar.getView();
((TextView) snackBarView.findViewById(R.id.snackbar_text)).setTextColor(Color.BLUE);
snackbar.show();
}
});