Android高级UI开发(十一)SnackBar的使用

举报
yd_57386892 发表于 2020/12/29 01:16:47 2020/12/29
【摘要】         Android系统从5.0开始引进了许多新的控件,它们给予了用户更好的体验,这些控件都遵循现在流行的Material Design设计原则。今天我们就来温故一下SnackBar控件,它是一种类似Android Toast(显示提示信息) 与 对话框的控件,经常用于给用户提示信息,比如“您还没有登录,请点击登录”.  SnackBar是介于Toast与对话框之间...

        Android系统从5.0开始引进了许多新的控件,它们给予了用户更好的体验,这些控件都遵循现在流行的Material Design设计原则。今天我们就来温故一下SnackBar控件,它是一种类似Android Toast(显示提示信息) 与 对话框的控件,经常用于给用户提示信息,比如“您还没有登录,请点击登录”.  SnackBar是介于Toast与对话框之间的产物,为什么这么说呢?我们来对比一下这3个控件:

  • Toast,它显示提示信息后,过几秒就会自动消失,与用户没有交互。不过,用户还可以点击主界面上的其它控件。
  •  对话框,它显示也提示信息,不过用户必须手动取消掉这个对话框之后才能与主界面交互。例如必须取消对话框,才能点击对话框下面的主界面上的按钮控件等。
  •  SnackBar,它类似于Toast提示信息,但是可以不用自动消失,而且还可以显示按钮,与用户交互,这一点类似于对话框,但是它又不同于对话框,当它停留在主界面之上的时候,用户无需取消它,仍然可以与主界面上的控件进行交互。

  通过以上描述我们发现SnackBar既能显示提示信息也能与用户交互,更重要的是它不妨碍我们操作主界面上的其它控件,它就是    介于Toast与对话框之间的产物。SnackBar的适用场景就是显示提示信息,它上边的交互按钮对用户来说不是必须操作的。Ok,接下来我们就详细介绍下SnackBar的用法及与Toast的对比。

1. 布局文件:


  
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. >
  6. <Button
  7. android:id="@+id/btToastShow"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:layout_alignRight="@+id/textView1"
  11. android:layout_below="@+id/textView1"
  12. android:layout_marginTop="66dp"
  13. android:text="显示Toast到中间" />
  14. <Button
  15. android:layout_marginTop="30dp"
  16. android:layout_below="@+id/btToastShow"
  17. android:id="@+id/btSnackBarShow"
  18. android:layout_width="wrap_content"
  19. android:layout_height="wrap_content"
  20. android:text="Snackbar" />
  21. </RelativeLayout>

  布局文件里放2个Button,点击第一个btToastShow用于显示Toast,点击第二个btSnackShow用于显示SnackBar以方便我们对比两者的用法。

 2. 代码:

MainActivity.java


  
  1. package com.anyikang.volunteer.sos.snackbar;
  2. import android.content.Context;
  3. import android.graphics.Color;
  4. import android.os.Bundle;
  5. import android.support.design.widget.Snackbar;
  6. import android.support.design.widget.Snackbar.Callback;
  7. import android.support.v7.app.AppCompatActivity;
  8. import android.util.Log;
  9. import android.view.Gravity;
  10. import android.view.LayoutInflater;
  11. import android.view.View;
  12. import android.view.View.OnClickListener;
  13. import android.widget.Button;
  14. import android.widget.TextView;
  15. import android.widget.Toast;
  16. public class MainActivity extends AppCompatActivity implements OnClickListener{
  17. Button btToastShow;
  18. Button btSnackBarShow;
  19. @Override
  20. protected void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.activity_main);
  23. //Toast显示
  24. btToastShow = this.findViewById(R.id.btToastShow);
  25. btToastShow.setOnClickListener(this);
  26. //SnackBar显示提示信息
  27. btSnackBarShow = this.findViewById(R.id.btSnackBarShow);
  28. btSnackBarShow.setOnClickListener(this);
  29. }
  30. @Override
  31. public void onClick(View view) {
  32. switch (view.getId())
  33. {
  34. case R.id.btToastShow:
  35. showCenterToast();
  36. break;
  37. case R.id.btSnackBarShow:
  38. showSnackbar(view);
  39. break;
  40. }
  41. }
  42. /**
  43. * 显示自定义Toast提示信息到屏幕中央
  44. */
  45. public void showCenterToast(){
  46. Toast centerToast = new Toast(this);
  47. LayoutInflater inflate =
  48. (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  49. View view = inflate.inflate(R.layout.center_toast, null);
  50. TextView tv = (TextView)view.findViewById(R.id.textView1);
  51. tv.setText("Hello 小伟");
  52. centerToast.setGravity(Gravity.CENTER, 0, 0);
  53. centerToast.setView(view);
  54. centerToast.setDuration(Toast.LENGTH_LONG);
  55. centerToast.show();
  56. }
  57. /**
  58. * 显示SnackBar
  59. */
  60. public void showSnackbar(View v){
  61. Snackbar snackbar = Snackbar.make(v, "请点击登录", Snackbar.LENGTH_INDEFINITE);
  62. snackbar.setAction("取消", new OnClickListener() {
  63. @Override
  64. public void onClick(View v) {
  65. //gxw- showCenterToast();
  66. }
  67. });
  68. snackbar.setAction("登录", new OnClickListener() {
  69. @Override
  70. public void onClick(View v) {
  71. showCenterToast();
  72. }
  73. });
  74. snackbar.setCallback(new Callback() {
  75. @Override
  76. public void onDismissed(Snackbar snackbar, int event) {
  77. Log.i("snackbar","SnackBar已消失");
  78. super.onDismissed(snackbar, event);
  79. }
  80. @Override
  81. public void onShown(Snackbar snackbar) {
  82. Log.i("snackbar","SnackBar已显示");
  83. super.onShown(snackbar);
  84. }
  85. });
  86. snackbar.setActionTextColor(Color.RED);
  87. snackbar.show();
  88. }
  89. }

代码分析  

1. showCenterToast

showCenterToast用于显示自定义Toast,在这里我们为Toast自定义了一个布局R.layout.center_toast,同时使用这行代码:centerToast.setGravity(Gravity.CENTER, 0, 0);将Toast显示在屏幕中央。

2. showSnackBar

  • 创建SnackBar

Snackbar snackbar = Snackbar.make(v, "请点击登录", Snackbar.LENGTH_INDEFINITE);这行代码创建了一个SnakeBar,需要3个参数:

(1)View v: 参数view可以随便提供一个VIEW控件的实例,如传入btSnackBarShow,这个与popupwindow比较类似都需要一个锚点,不过这里传递view是为了找到view的parent view,其实最终找到btSnackBarShow的parentview为整个窗体。这也是SnackBar能像对话框一样覆盖在整个主界面之上的原因。

(2)提示信息

(3)显示时间,这里我们设置为Snackbar.LENGTH_INDEFINITE,即不让它自动消失,我们通过手动点击SnackBar上面的按钮让它消失。当然,我们也可以设置成与Toast一样,让它显示一会儿自动消失。

  • 定义SnackBar上的交互按钮

  
  1.     snackbar.setAction("取消", new OnClickListener() {
  2.             @Override
  3.             public void onClick(View v) {
  4.                 //gxw- showCenterToast();
  5.             }
  6.         });
  7.         snackbar.setAction("登录", new OnClickListener() {
  8.             @Override
  9.             public void onClick(View v) {
  10.                 showCenterToast();
  11.             }
  12.         });

   这里我们连续定义了2个action交互按钮,其实起效的只有一个就是后来的“登录”按钮,在此为了告诉大家SnackBar上只能有一    个交互按钮,如果定义多个后者会覆盖前面的按钮。

  • 显示SnackBar:设置交互按钮的颜色与显示SnackBar    

  
  1.   snackbar.setActionTextColor(Color.RED);
  2.   snackbar.show();

 

  • SnackBar的显示与隐藏的监听

  
  1. snackbar.setCallback(new Callback() {
  2. @Override
  3. public void onDismissed(Snackbar snackbar, int event) {
  4. Log.i("snackbar","SnackBar已消失");
  5. super.onDismissed(snackbar, event);
  6. }
  7. @Override
  8. public void onShown(Snackbar snackbar) {
  9. Log.i("snackbar","SnackBar已显示");
  10. super.onShown(snackbar);
  11. }
  12. });

当点击SnackBar上的Action交互按钮时SnackBar会消失,这时会回调onDismissed函数。同理,显示SnackBar时会回调onShown函数。

显示效果如图如下:

源码下载:https://download.csdn.net/download/gaoxiaoweiandy/10675098

 

 

 

 

文章来源: blog.csdn.net,作者:冉航--小虾米,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/gaoxiaoweiandy/article/details/82717202

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。