注册

用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();

}

这里的意思是说,如果项目中有SnackbarBottomSheetDialog库的引用,则使用DefaultDesignUIController的UI,也就是Snackbar的提示;没有的话,则使用DefaultUIController的UI,也就是默认的Toast提示。


实际上其实谷歌在Android 5.0的时候就推出了Snackbar,它是Material Design中的一个控件。


实践 Snackbar


下图为ToastSnackbar的展示效果


image.png



  • 简单的提示

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,不然旧的会被替代掉。




  1. Snackbar.LENGTH_INDEFINITE:代表无限期的显示,一直显示,点击按钮才可以隐藏




  2. Snackbar.LENGTH_LONG:长时间提示




  3. 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>

作者:Android唐浮
链接:https://juejin.cn/post/7103803312910106660
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

0 个评论

要回复文章请先登录注册