欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android重要控件SnackBar使用方法详解

程序员文章站 2024-03-05 16:09:31
snackbar是designsupportlibrary中的一个重要的控件,用于在界面下面提示一些关键信息,跟toast不同的地方是snackbar允许用户向右滑动消除它...

snackbar是designsupportlibrary中的一个重要的控件,用于在界面下面提示一些关键信息,跟toast不同的地方是snackbar允许用户向右滑动消除它,同时,也允许在snackbar中设定一个action,当用户点击了snackbar里面的按钮的时候,可以进行一些操作,所以,功能绝对是很强大的。 

snackbar的构造: 

// 参数分别是父容器,提示信息,持续时间public static snackbar make(@nonnull view view, @nonnull charsequence text,@duration int duration) 

snackbar的常用方法: 

// 用于给snackbar设定一个action,点击之后会回调onclicklistener中的onclick方法public snackbar setaction(charsequence text, final view.onclicklistener listener) 
// 用于设定action的字体颜色public snackbar setactiontextcolor(@colorint int color) 
// 设定提示的字体public snackbar settext(@nonnull charsequence message) 
// 展示snackbarpublic void show() 
// 清除snackbarpublic void dismiss() 
// 设置回调,比如ondismissed或者onshownpublic snackbar setcallback(callback callback) 

简单是使用就不说了,这里直接说一下设置action和设置callback
要求:实现一个撤销的操作,用户点击列表中每一项的删除按钮之后,删除(数据库中)对应的行,然后弹出snackbar提示是否撤销,如果选择是,则恢复删除的行,否则删除该行,效果如下 

思路: 
①先对我们要删除的这个行进行备份,然后在点击删除按钮的时候把行删除,把数据从源删除,然后刷新 
②弹出snackbar,设定action,如果点了yes,就把数据插入到源中,刷新 
③设定callback,监听snackbar的消失事件,如果不是点击action而消失,则将数据从sqlite中删除 
注意:这里为什么要设定监听?因为如果不进行监听,需要在删除的时候访问数据库,撤销是时候进行数据库的插入操作,这样列表中的条目位置会发生改变

我们可以在adapter中对删除按钮进行监听,代码如下:

delete.setonclicklistener(new view.onclicklistener() {
   @override
   public void onclick(view v) {
    backupmap = mdata.get(position);
    mdata.remove(position);
    notifydatasetchanged();
    snackbar snackbar = snackbar.make(root, "是否撤销删除?", snackbar.length_long);
    snackbar.setaction("yes", new myonclicklistener(position));
    snackbar.setcallback(new mycallback());
    snackbar.show();
   }
  });

如果点击了删除按钮,我们对数据进行备份,然后删除数据源mdata对应的这个map,接下来刷新界面。然后第7行构造了一个snackbar,询问是否撤销删除,并把持续时间设置为long以免用户未阅读完文字snackbar就消失了。第8行设定了点击的action,提示信息为“yes”,并提供了点击的监听。第9行设定了callback,判断snackbar的消失状态。第10行就直接把snackbar展示出来。 

下面来看action的点击事件: 

private class myonclicklistener implements view.onclicklistener {
  private final int position;

  public myonclicklistener(int position) {
   this.position = position;
  }

  @override
  public void onclick(view v) {
   mdata.add(position, backupmap);
   notifydatasetchanged();
  }
 }

如果点击了action,就用备份的数据进行恢复
下面看callback: 

private class mycallback extends snackbar.callback {
  @override
  public void ondismissed(snackbar snackbar, int event) {
   super.ondismissed(snackbar, event);
   if (event == dismiss_event_swipe || event == dismiss_event_timeout || event ==
     dismiss_event_consecutive) {
    mdatabase.execsql("delete from tally where id=?", new string[]{backupmap.get
      ("id").tostring()});
   }
  }
 }

这里看到我们重写了ondismissed方法,在snackbar消失的时候会回调这个方法,我们先判断这个消失的类型,如果是点击了action,就不用删除数据库中的数据,否则就对数据库进行删除。 
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; 


可以看到,从0到4分别是滑动清除、点击action、持续时间结束、调用dismiss方法以及有新的snackbar产生
 因为每次snackbar消失的时候都是调用了dismiss方法,所以我们只需要判断此时的状态是否为滑动清除、持续时间结束或者新的snackbar产生,如果是,则证明用户不需要撤销,则对数据库进行删除。 
最后,如果使用snackbar,记得添加依赖!!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。