2016年12月25日星期日

Android提醒控件,Dialog、Toast和Snakebar

什么是Dialog,Dialog的实例 根据郭霖老师的一篇文章郭霖老师的一篇文章,作改动 什么是Dialog 在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择。这些功能我们叫它Android Dialog对话框。 Dialog的实例 ``` AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Title") .setMessage("Dialog content.") .setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }) .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }) .show(); ``` 上面的代码就可以弹出一个非常精美的Dialog了,效果如下:

效果图看我的原文

Android提醒控件,Dialog、Toast和Snakebar
上面这个Dialog是Material Design风格的,因为是在6.0系统上运行的,会自动赋予这样的风格。但是如果在老版本系统上运行,比如说2.3系统,会是什么样的效果?运行一下就知道了,效果如下图所示:
效果图看我的原文

Android提醒控件,Dialog、Toast和Snakebar

这个效果虽然比较丑,不过没办法,这就是2.3系统当时的风格。 人的审美总是在进步的,我们有没有什么办法在老版本的系统中也使用Material Design风格的Dialog呢?当然有,Google已经充分考虑到了这一点,在appcompat-v7库中也提供了一个AlertDialog类,完整路径是:
  • android.support.v7.app.AlertDialog
使用这个包中的AlertDialog,就能让对话框在所有的系统版本中都保持一致的风格了。 

慎用Dialog Dialog的作用是给用户一个提示信息,并让用户根据提示做出判断。而Dialog的特征就是,它会阻止你原本正在进行的操作,必须停止下来对Dialog进行处理。但是,大多数的人可能并不喜欢这样被打断,也许用户正在处理一项重要的操作,突然弹出一个Dialog遮挡住了他原本的操作,这时候用户就可能会对此感到很恼火。因此,一定要慎用Dialog。这时候我们就要思考如何弹出提示信息并且不干扰用户正在进行的操作你? --------------------------------------------------------------------------- 什么是Toast,Toast的实例
什么是Toast 说到不会阻挡用户原本正在进行的操作,就延伸到我们今天的第二个主题,Toast。Toast只会弹出一段信息,告诉用户某某事情已经发生了,过一段时间后就会自动消失。它完全不会阻挡用户的任何操作,甚至用户也可以完全不用理会Toast。 Toast的实例 Toast的基本用法 ``` Toast.makeText(context, "things happened", Toast.LENGTH_SHORT).show(); ``` 最后一个参数用于指定Toast显示的时长,Toast.LENGTH_SHORT表示显示时间较短,Toast.LENGTH_LONG表示显示时间较长。 Toast的缺点和改进 如果快速连续点击了五次Toast按钮,Toast也就触发了五次。这样的体验其实是不好的,因为也许用户是手抖了一下多点了几次,导致Toast就长时间关闭不掉了。又或者我们其实已在进行其他操作了,应该弹出新的Toast提示,而上一个Toast却还没显示结束。 因此,最佳的做法是将Toast的调用封装成一个接口,写在一个公共的类当中,如下所示: ``` public class Util { private static Toast toast; public static void showToast(Context context, String content) { if (toast == null) { toast = Toast.makeText(context, content, Toast.LENGTH_SHORT); } else { toast.setText(content); } toast.show(); } } ``` 这里和我们平时使用Toast的方式并不一样,这里会先判断Toast对象是否为空,如果是空的情况下才会调用makeText()方法来去生成一个Toast对象,否则就直接调用setText()方法来设置显示的内容,最后再调用show()方法将Toast显示出来。由于不会每次调用的时候都生成新的Toast对象,因此刚才我们遇到的问题在这里就不会出现了。 调用的时候也很简单,只需要把Context对象和Toast要显示的内容传进来就可以了: ``` Util.showToast(context, "things happened"); ``` 现在不管我们触发多少次Toast调用,都只会持续一次Toast显示的时长了。 慎用Toast Toast的作用是告诉用户现在发生了什么事情,不会阻挡用户的操作,但同时用户只能被动接收这个事情,因为没有什么办法来让用户是选择同意还是拒绝。 虽说Toast在用户体验方面要比Dialog好一些,但是也要慎用,尤其是涉及到一些敏感操作的时候。比如说删除数据,只给用户一个提示:“你的数据已被删除”,而不给用户选择是否要删除的机会,这时候用户可能就要暴走了。 ---------------------------------------------------------------------------

什么是Snakebar,Snakebar和Toast的区别
什么是Snakebar Snackbar是Android Support Design Library库支持的一个控件,具体的使用配置可以查看:Android Support Design Library配置指南,这篇文章说明了配置过程,以及可能遇到的问题,主要是跟NavigationLibrary开源库的冲突问题。 Snackbar使用的时候需要一个控件容器用来容纳Snackbar.官方推荐使用CoordinatorLayout这个另一个Android Support Design Library库支持的控件容纳。因为使用这个控件,可以保证Snackbar可以让用户通过向右滑动退出。 Snakebar和Toast的区别 Snackbar 是一种针对操作的轻量级反馈机制,常以一个小的弹出框的形式,出现在手机屏幕下方或者桌面左下方。它们出现在屏幕所有层的最上方,包括浮动操作按钮。 它们会在超时或者用户在屏幕其他地方触摸之后自动消失。Snackbar 可以在屏幕上滑动关闭。当它们主要用于提示系统消息的胶囊状的提示框 Toast。Toast 同 Snackbar 非常相似,但是 Toast 并不包含操作也不能从屏幕上滑动关闭。
  • 当它显示一段时间后或用户与屏幕交互时它会自动消失。

  •  可以自定义action-可选操作。 swiping it off the

  •  screen可以让FAB消失

  •  它是context sensitive message(自己理解吧),所以这些消息是UIscreen的一部分并且它是显示在所有屏幕其它元素之上(屏幕最顶层),并不是像Toast一样覆盖在屏幕上。

  •  同一时间只能显示一个snackbar。
Snakebar的使用 在使用Snackbar之前,首先需要在app/build.gradle中添加相应的依赖: ``` dependencies { compile 'com.android.support:design:23.4.0' } ``` 然后就可以使用Snackbar了,它的用法和Toast是比较相似的: ``` Snackbar.make(view, message, duration) .setAction(action message, click listener) .show(); ``` 这里调用Snackbar的make()方法来创建一个Snackbar对象,make()方法的第一个参数需要传入一个view,只要是当前界面布局的任意一个view都可以,Snackbar会使用这个view来自动查找最外层的布局,用于展示Snackbar。第二个参数就是Snackbar中显示的内容,第三个参数是Snackbar显示的时长。这些和Toast都是类似的。 接着这里又调用了一个setAction()方法来设置一个动作,从而让Snackbar不仅仅是一个提示,而是可以和用户进行交互的。最后调用show()方法让Snackbar显示出来。 Snackbar的效果有点类似于Toast,不过它是从屏幕底部弹出来的。另外Snackbar上面可以加入和用户交互的按钮,比如删除数据的时候给用户一个Undo的选项,从这些小的细节方面都可以提升很多的用户体验。 方法
  • make() – 生成Snackbar消息
  • setAction() – 设置action
  • make() – 显示Snackbar消息
参数
  • make()方法的第一个参数是一个view, snackbar会试着寻找一个父view来hold这个view. Snackbar将遍历整个view tree 来寻找一个合适的父view,它可能是一个coordinatorLayout也可能是window decor’s content view,随便哪一个都行。

  •  正如上面所提到,duration参数和Toast中的duration参数类似,只能是LENGTH_SHORT 或
  •  LENGTH_LONG,不能是其它任何随机数。
短文本 通常 Snackbar 的高度应该仅仅用于容纳所有的文本,而文本应该与执行的操作相关。Snackbar中不能包含图标,操作只能以文本的形式存在。 暂时性 为了保证可用性,Snackbar 不应该成为通往核心操作的唯一方式。作为在所有层的上方,Snackbar 不应该持续存在或相互堆叠。 不要阻挡了浮动操作按钮 垂直移动浮动操作按钮到 Snackbar 的上方。 最多0-1个操作,不包含取消按钮 当一个动作发生的时候,应当符合提示框和可用性规则。当有2个或者2个以上的操作出现时,应该使用提示框而不是Snackbar,即使其中的一个是取消操作。如果 Snackbar 中提示的操作重要到需要打断屏幕上正在进行的操作,那么理当使用提示框而非Snackbar。 配置Snackbar可选操作 我们可以使用额外的可选操作来配置snackbar,比如setActionTextColor 和 setDuration: ``` Snackbar.make(rootlayout, "Hello SnackBar!", Snackbar.LENGTH_SHORT) .setAction("Undo", new View.OnClickListener() { @Override public void onClick(View v) { // Perform anything for the action selected } }) .setActionTextColor(R.color.material_blue) .setDuration(4000).show(); ```

---------------------------------------------------------------------------
总结
  •  Dialog:当提示信息是至关重要的,并且必须要由用户做出决定才能继续的时候,使用Dialog。

  •  Toast:当提示信息只是告知用户某个事情发生了,用户不需要对这个事情做出响应的时候,使用Toast。

  •  Snackbar:以上两者之外的任何其他场景,Snackbar可能会是你最好的选择。
---------------------------------------------------------------------------

没有评论:

发表评论