安卓通知控件SnackBar解析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓通知控件SnackBar解析相关的知识,希望对你有一定的参考价值。

参考技术A Dialog的作用是给用户一个提示信息,并让用户根据提示做出判断。而Dialog的特征就是,它会阻止你原本正在进行的操作,必须停止下来对Dialog进行处理。但是,大多数的人可能并不喜欢这样被打断,也许用户正在处理一项重要的操作,突然弹出一个Dialog遮挡住了他原本的操作,这个时候用户会变得很恼火。
因此,使用Dialog的时候还是谨慎一点比较好,尽量不要给用户带来糟糕的体验感。

Toast的作用是告诉用户现在发生了什么事情,不会阻挡用户的操作,但同时用户只能被动接收这个事情,因为没有什么办法来让用户是选择同意还是拒绝。
虽说Toast在用户体验方面要比Dialog好一些,但是也要慎用,尤其是涉及到一些敏感操作的时候。比如说删除数据,只给用户一个提示:“你的数据已被删除”,而不给用户选择是否要删除的机会,这个时候用户可能就要暴走了。

如果说Dialog和Toast是两个极端的话,那么Snackbar就是处于中间的位置了。Snackbar和Toast比较相似,但是用途更加广泛,并且它是可以和用户进行交互的。Snackbar使用一个动画效果从屏幕的底部弹出来,过一段时间后也会自动消失。

Dialog:当提示信息是至关重要的,并且必须要由用户做出决定才能继续的时候,使用Dialog。 Toast:当提示信息只是告知用户某个事情发生了,用户不需要对这个事情做出响应的时候,使用Toast。 Snackbar:以上两者之外的任何其他场景,Snackbar可能会是你最好的选择。
Snackbar用法
在使用Snackbar之前,首先需要在app/build.gradle中添加相应的依赖:
dependencies compile 'com.android.support:design:23.4.0'

Snackbar.make(view, "data deleted",Snackbar.LENGTH_LONG) .setAction("Undo", new View.OnClickListener() @Override public void onClick(View v) ) .show();

这里调用Snackbar的make()方法来创建一个Snackbar对象,make()方法的第一个参数需要传入一个view,只要是当前界面布局的任意一个view都可以,Snackbar会使用这个view来自动查找最外层的布局,用于展示Snackbar。第二个参数就是Snackbar中显示的内容,第三个参数是Snackbar显示的时长。这些和Toast都是类似的。
接着这里又调用了一个setAction()方法来设置一个动作,从而让Snackbar不仅仅是一个提示,而是可以和用户进行交互的。最后调用show()方法让Snackbar显示出来。

短文本
通常 Snackbar 的高度应该仅仅用于容纳所有的文本,而文本应该与执行的操作相关。Snackbar 中不能包含图标,操作只能以文本的形式存在。
最多0-1个操作,不包含取消按钮
当一个动作发生的时候,应当符合提示框和可用性规则。当有2个或者2个以上的操作出现时,应该使用提示框而不是 Snackbar,即使其中的一个是取消操作。如果 Snackbar 中提示的操作重要到需要打断屏幕上正在进行的操作,那么理当使用提示框而非 Snackbar。
以上是引用自google官方文档
另外还有一个特点:
暂时性
为了保证可用性,Snackbar 不应该成为通往核心操作的唯一方式。作为在所有层的上方,Snackbar 不应该持续存在或相互堆叠。

SnackBar提供了很好的交互体验,希望后面大家可以引用它。

安卓Android Support Design Library——Snackbar

介绍:

  SnackbarAndroid Support Design Library库支持的一个控件,用于在界面下面提示一些关键信息,跟Toast不同的地方是SnackBar允许用户向右滑动消除它,同时,也允许在SnackBar中设定一个Action,当用户点击了SnackBar里面的按钮的时候,可以进行一些操作,所以,功能绝对是很强大的。

  官方推荐使用CoordinatorLayout(另一个Android Support Design Library库支持的控件)容纳。因为使用这个控件,可以保证Snackbar可以让用户通过向右滑动退出。

 

由浅入深:

1、基础功能:从底部弹出snackbar

在xml文件中定义snackBar的容器:Coordinator容器:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <Button
        android:onClick="createSnackbar"
        android:text="Snackbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <android.support.design.widget.CoordinatorLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"/>
</RelativeLayout>

activity中显示 Snackbar(它的用法与Toast很像,它出现后三秒之后从底部弹出,或者用户 向右滑动,它被滑出)

public class SnackbarTest extends AppCompatActivity {
    CoordinatorLayout container;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_snackbar_test);
        container = (CoordinatorLayout) findViewById(R.id.container);

    }
    public void createSnackbar(View v){
         Snackbar.make(container,"Snackbar maker", Snackbar.LENGTH_LONG).show();
    }
}

Snackbar的第一个容器参数也可以是 LinearLayout或其他容器,当Snackbar弹出时,没有向右滑出效果。

 

2、添加按钮,并定义点击事件

Snackbar.make(container,"Snackbar with button",Snackbar.LENGTH_LONG)
.setAction("action", new View.OnClickListener() {
@Override
public void onClick(View v) {
//
}
})
.setActionTextColor(Color.RED)
.show();

3、设置Snackbar回调 onshow 和 onDismissed

自定义 Snackbar.Callback 类

public class MyCallback extends Snackbar.Callback{
    @Override
    public void onDismissed(Snackbar transientBottomBar, int event) {
        super.onDismissed(transientBottomBar, event);
        if(event == DISMISS_EVENT_SWIPE || event == DISMISS_EVENT_TIMEOUT
                || event == DISMISS_EVENT_CONSECUTIVE){

        }
    }
    @Override
    public void onShown(Snackbar sb) {
        super.onShown(sb);
        //
    }
}

Snackbar设置callBack()

Snackbar.make(container,"Snackbar maker", Snackbar.LENGTH_LONG)
        .setCallback(new MyCallback())
        .show();

补充Snackbar消失的类型:

/** Indicates that the Snackbar was dismissed via a swipe.*/
public static final int DISMISS_EVENT_SWIPE = 0;
/** Indicates that the Snackbar was dismissed via an action click.*/
public static final int DISMISS_EVENT_ACTION = 1;
/** Indicates that the Snackbar was dismissed via a timeout.*/
public static final int DISMISS_EVENT_TIMEOUT = 2;
/** Indicates that the Snackbar was dismissed via a call to {@link #dismiss()}.*/
public static final int DISMISS_EVENT_MANUAL = 3;
/** Indicates that the Snackbar was dismissed from a new Snackbar being shown.*/
public static final int DISMISS_EVENT_CONSECUTIVE = 4;

 

后续查看补充:

http://www.jianshu.com/p/cd1e80e64311

 

Coordinator 容器:

http://www.jianshu.com/p/488283f74e69

http://www.cnblogs.com/itgungnir/p/6210803.html

 

以上是关于安卓通知控件SnackBar解析的主要内容,如果未能解决你的问题,请参考以下文章

安卓Android Support Design Library——Snackbar

Android Snackbar简单解析

轻量级控件SnackBar应用&源码分析

Android Material Design控件使用——CardView和SnackBar使用

Snackbar.setCallback() 在 Android AppCompat 中无法解析

无法解析 floatinbuttonAction 和snackbar