用Snackbar代替Toast
用Snackbar代替Toast
Toast是远古的安卓原生组件,在不方便打印日志的时候,Toast可以直观的看出来看出来日志;更多的Toast作为一种提示,默认的Toast提示小,区域不明显,且不美观,虽然可以通过自定义Toast解决。这篇文章讲的是Snackbar。
认识Snackbar
我是在看某个三方库源码的时候发现它的,在以往的开发经验中,它出现的频率并不高。我在某个三方库中发现,在两个项目中,提示的表现却不一样,代码怎么会骗人呢。于是认真的看这个三方库的源码,直到看到下面的判断。
static {
try {
Class.forName("android.support.design.widget.Snackbar");
Class.forName("android.support.design.widget.BottomSheetDialog");
HAS_DESIGN_LIB = true;
} catch (Throwable ignore) {
HAS_DESIGN_LIB = false;
}
}
protected AbsAgentWebUIController create() {
return HAS_DESIGN_LIB ? new DefaultDesignUIController() : new DefaultUIController();
}
这里的意思是说,如果项目中有Snackbar
、BottomSheetDialog
库的引用,则使用DefaultDesignUIController
的UI,也就是Snackbar
的提示;没有的话,则使用DefaultUIController
的UI,也就是默认的Toast
提示。
实际上其实谷歌在Android 5.0的时候就推出了Snackbar
,它是Material Design
中的一个控件。
实践 Snackbar
下图为Toast
和Snackbar
的展示效果
- 简单的提示
Snackbar
的基本用法和Toast
类似
Snackbar.make(findViewById(R.id.root), "这是一条提示", Snackbar.LENGTH_LONG).show();
- 带有Action的提示
Snackbar snackbar = Snackbar.make(view, "这是一个提示", Snackbar.LENGTH_INDEFINITE);
snackbar.setAction("取消", new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"点击取消",Toast.LENGTH_SHORT).show();
}
});
snackbar.show();
这里只能设置一个Action
,不然旧的会被替代掉。
Snackbar.LENGTH_INDEFINITE:代表无限期的显示,一直显示,点击按钮才可以隐藏
Snackbar.LENGTH_LONG:长时间提示
Snackbar.LENGTH_SHORT:短时间提示
- 修改样式
更改Snackbar
的背景颜色
snackbar.getView().setBackgroundColor(Color.parseColor("#0000ff"));
更改Action
提示的颜色
snackbar.setActionTextColor(Color.parseColor("#ffffff"));
更改padding
的距离
snackbar.getView().setPadding(50, 50, 50 , 50);
操作文字,比如添加图片、更改文字内容、更改文字颜色,更改文字大小等。
虽然Snackbar
没有提供给我们直接操作文字样式的方法,但我们可以通过findViewById
获取这个文字,然后就像操作TextView
一样去操作它就可以了。
怎么获取TextView
?
TextView textView = snackbar.getView().findViewById(R.id.snackbar_text);
snackbar_text
id来自Snackbar
的源码。获取ID的时候编辑器可能会报错提示,实际上是可以运行的。
@NonNull
public static Snackbar make(@NonNull View view, @NonNull CharSequence text, int duration) {
ViewGroup parent = findSuitableParent(view);
if (parent == null) {
throw new IllegalArgumentException("No suitable parent found from the given view. Please provide a valid view.");
} else {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
SnackbarContentLayout content = (SnackbarContentLayout)inflater.inflate(hasSnackbarButtonStyleAttr(parent.getContext()) ? layout.mtrl_layout_snackbar_include : layout.design_layout_snackbar_include, parent, false);
Snackbar snackbar = new Snackbar(parent, content, content);
snackbar.setText(text);
snackbar.setDuration(duration);
return snackbar;
}
}
<view
xmlns:android="http://schemas.android.com/apk/res/android"
class="android.support.design.widget.SnackbarContentLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:theme="@style/ThemeOverlay.AppCompat.Dark">
<TextView
android:id="@+id/snackbar_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical|left|start"
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:ellipsize="end"
android:maxLines="@integer/design_snackbar_text_max_lines"
android:textAlignment="viewStart"
android:textAppearance="?attr/textAppearanceBody2"/>
<Button
android:id="@+id/snackbar_action"
style="?attr/snackbarButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/design_snackbar_extra_spacing_horizontal"
android:layout_marginLeft="@dimen/design_snackbar_extra_spacing_horizontal"
android:layout_gravity="center_vertical|right|end"
android:minWidth="48dp"
android:visibility="gone"/>
</view>
链接:https://juejin.cn/post/7103803312910106660
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。