`
VIP庚
  • 浏览: 223313 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

SnackBar 中添加多个按钮

阅读更多
  最近无意间看到一篇文章,解决了我很久以前的困扰
  简单介绍一下SnackBar:
SnackBar是 Android Support Library 22.2.0 里面新增提供的一个控件,是Toast的威力加强版.

优点:
1. 配合CoordinatorLayout使用,SnackBar可以被Swipe手势划走;

2. setAction功能.在SnackBar上可以设定一个按钮.Inbox里面UNDO就是通过SnackBar的setAction来实现的;

具体使用方法很简单,网上有很多例子,这儿就不介绍了

在谷歌 Material Design设计规范中这样写道:
短文本

  通常 Snackbar 的高度应该仅仅用于容纳所有的文本,而文本应该与执行的操作相关。Snackbar 中不能包含图标,操作只能以文本的形式存在。

最多0-1个操作,不包含取消按钮

  当一个动作发生的时候,应当符合提示框和可用性规则。当有2个或者2个以上的操作出现时,应该使用提示框而不是 Snackbar,即使其中的一个是取消操作。如果 Snackbar 中提示的操作重要到需要打断屏幕上正在进行的操作,那么理当使用提示框而非 Snackbar。


这个是系统SnackBar的布局:
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
        android:id="@+id/snackbar_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:paddingTop="14dp"
        android:paddingBottom="14dp"
        android:paddingLeft="12dp"
        android:paddingRight="12dp"
        android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"
        android:maxLines="2"
        android:layout_gravity="center_vertical|left|start"
        android:ellipsize="end"
        android:textAlignment="viewStart"/>

<Button
        android:id="@+id/snackbar_action"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="0dp"
        android:layout_marginStart="0dp"
        android:layout_gravity="center_vertical|right|end"
        android:paddingTop="14dp"
        android:paddingBottom="14dp"
        android:paddingLeft="12dp"
        android:paddingRight="12dp"
        android:visibility="gone"
        android:textColor="?attr/colorAccent"
        style="?attr/borderlessButtonStyle"/>
</merge>


也就是说我们只能为snackbar设置一个按钮,且这个按钮不是取消按钮。但有时候我们需要两个按钮,这时候我们可能会想到重新自己写个SnackBar了,这儿有一个更简单的办法

1、 写个布局来存放要添加的按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    >
    <Button
        android:id="@+id/cancel_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="14dp"
        android:paddingBottom="14dp"
        android:textColor="?attr/colorAccent"
        style="?attr/borderlessButtonStyle"/>

</LinearLayout>


按钮样式是参照SnackBar布局中按钮的样式

2、SnackBar工具类 用来将布局添加进SnackBar
 /**
     * 向snackbar布局中添加view
     *
     * @param snackbar
     * @param layoutId 新添加布局 id
     * @param index    添加的位置
     */
    public static void SnackbarAddView(Snackbar snackbar, int layoutId, int index) {
        View snackbarview = snackbar.getView();//获取snackbar的View(其实就是SnackbarLayout)

        Snackbar.SnackbarLayout snackbarLayout = (Snackbar.SnackbarLayout) snackbarview;//将获取的View转换成SnackbarLayout

        View add_view = LayoutInflater.from(snackbarview.getContext()).inflate(layoutId, null);//加载布局文件新建View

        LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);//设置新建布局参数

        p.gravity = Gravity.CENTER_VERTICAL;//设置新建布局在Snackbar内垂直居中显示

        snackbarLayout.addView(add_view, index, p);//将新建布局添加进snackbarLayout相应位置
    }



index为添加的位置,当index为1,就会放在SnackBar中TextView的后面,自带button的前面

3 SnackBar工具类 为添加进来的按钮设置监听器,和显示文字
   /**
     * 为snackbar中指定按钮控件添加点击监听器
     * @param snackbar
     * @param btn_id
     * @param onClickListener
     */
    public static void SetAction(Snackbar snackbar, int btn_id, String action_string, View.OnClickListener onClickListener) {
        View view = snackbar.getView();//获取Snackbar的view
        if (view != null) {
            //为添加的按钮设置监听器
            ((Button)view.findViewById(btn_id)).setText(action_string);
            (view.findViewById(btn_id)).setOnClickListener(onClickListener);
        }
    }


4、使用
 final Snackbar snackbar = Snackbar.make(coordinatorLayout, "删除该联系人?", Snackbar.LENGTH_LONG);
            //添加新按钮
            SnackbarUtil.SnackbarAddView(snackbar,R.layout.snakerbar_add_layout,1);
            //设置新添加的按钮监听器
            SnackbarUtil.SetAction(snackbar,R.id.cancel_btn,"取消",new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    snackbar.dismiss();
                }
            });

            //设置snackbar自带的按钮监听器
            snackbar.setAction("确定", new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                   
                    Toast.makeText(context, "删除联系人成功", Toast.LENGTH_SHORT).show();
                    initData();
                }

            });

            snackbar.show();






同样的我们也可以将图片等东西添加进去...

我不建议为snackBar添加多个按钮,因为谷歌 Material Design设计规范已经说了,SnackBar是轻量级的,但有时候需求就是这样。就像以前Material Design规定不建议使用和iphone一样的底部导航栏,而现在的现在Material Design设计规范中加入底部导航栏,当用的人多了,自然就成了规范
  • 大小: 9.7 KB
0
0
分享到:
评论

相关推荐

    Android顶部、底部标签,自定义Dialog、Snackbar、Toast,悬浮按钮,展示图伸缩效果,发送消息界面效果,登录界面效果等。

    这些组件和效果的实现涉及到Android UI设计、事件处理、数据绑定、动画等多个方面,开发者需要对Android SDK有深入理解,同时熟悉Android Studio的使用。"MDStudySamples-master"项目为学习和实践这些概念提供了很好...

    弹出框SnackBar

    在提供的`Lsn26_SnackBar`项目中,你将找到关于SnackBar的各种示例,包括基本使用、添加操作按钮、改变样式和位置等。通过阅读源代码和运行示例,你可以深入理解如何在实际项目中灵活运用SnackBar。 总结来说,...

    iOS 仿 Android SnackBar 提示效果.zip

    4. **堆叠管理**:当多个SnackBar需要显示时,LPSnackbar可以智能地管理它们的堆叠,避免遮挡或冲突。 5. **兼容性**:由于是独立的控件,LPSnackbar与UIKit框架兼容,可以在不同版本的iOS系统上运行。 在实际应用...

    Android轻量级的提示控件:Snackbar

    总结来说,Snackbar是Android开发中的一个重要组件,它在信息提示和用户交互方面提供了更多可能性。理解并熟练运用Snackbar,能够提升应用的用户体验,同时也展示了开发者对现代Android开发规范的遵循和理解。在实际...

    snackbar使用Demo

    `Snackbar`具有一定的可定制性,比如可以设置不同的持续时间(短时、长时)和添加一个操作按钮,让用户能够快速响应提示。 `Snackbar`的使用步骤大致如下: 1. **创建Snackbar实例**:首先,你需要通过`Snackbar....

    KSnack,可自定义的snackbar消息。.zip

    4. **添加动作**: 如果需要,可以添加一个或多个动作到Snackbar,如`KSnack.Builder().addAction()`。 5. **自定义样式**: 通过设置`KSnack.Builder()`的各种属性来自定义Snackbar的样式,包括颜色、字体、动画等。...

    snackbar一个微小的浏览器库用于在屏幕底部显示简短消息1kBgzip

    5. **非阻塞交互**: 用户可以继续与页面的其他元素进行交互,而无需关闭 `Snackbar` 提示,这在多任务处理中特别有用。 6. **事件处理**: `Snackbar` 可以与事件绑定,比如点击关闭按钮或在特定时间自动消失,从而...

    Snackbar使用DEMO下载 可修改字体大小,颜色,滑动消失 代替Toast

    5. **代码结构**:DEMO可能包含一个自定义的Snackbar类,继承自`android.support.design.widget.Snackbar`,以便添加更多的自定义功能。这样可以在保留原有Snackbar特性的基础上,方便地扩展其行为。 6. **资源文件...

    Snackbar使用

    3. 可选地,可以通过` Snackbar#setAction()`添加一个操作按钮,传入文本和监听器。当用户点击时,监听器的`onAction()`方法会被调用。 4. 最后,调用`show()`方法来显示Snackbar。 示例代码: ```java View parent...

    可顶部和底部显示的Snackbar

    1. 创建一个新的布局文件(如`custom_snackbar.xml`)在`layout`目录下,包含Snackbar的内容视图和动作按钮,如果有的话。 2. 实现一个自定义的`Snackbar`类,覆盖`show()`方法,以便在需要时更改视图的位置。这可能...

    swift-ReactNativeMD风格的Snackbar

    8. **性能优化**:避免在短时间内连续显示多个 Snackbar,以免打扰用户。 9. **测试**:在多种设备和操作系统版本上进行测试,确保在各种环境下都能正常工作。 通过学习和实践以上知识点,你可以在 React Native ...

    SnackBar工具类1

    8. **批量管理**:支持一次性创建多个SnackBar,并按照设定的顺序依次显示。 9. **错误处理**:提供错误处理机制,如当无法显示SnackBar时给出提示或记录日志。 10. **国际化支持**:支持多语言,使应用更具全球化...

    swift-TTGSnackbarAndroid下SnackBar的iOS版实现

    4. **显示SnackBar**:调用显示方法将SnackBar添加到当前视图控制器的视图上。 5. **处理用户交互**:如果设置了操作按钮,可以注册一个回调来处理用户的点击事件。 6. **隐藏SnackBar**:当需要隐藏SnackBar时,...

    react-reactnotificationReact的Snackbar通知组件

    例如,你可以在一个函数中批量添加多个通知,或者在异步操作完成后调用`NotificationManager`。 总的来说,`react-notification`是一个功能强大且易于使用的React通知组件库,它能够帮助开发者快速实现UI中的...

    SnackBar.zip

    这个压缩包可能包含了一个名为"SnackBar-master"的项目源码,这可能是一个示例项目或库,用于展示如何在Android应用中使用SnackBar。 首先,让我们深入了解一下SnackBar的基本概念。SnackBar是Android设计支持库中...

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

    Android中的SnackBar是一个重要的UI组件,源自Design Support Library,它的主要作用是在界面底部提供短暂的通知,显示关键信息。SnackBar与Toast类似,但具有更多的交互性。它允许用户通过滑动手势来消除,同时还...

    Flutter-Snackbar:颤抖小吃店

    Flutter中的SnackBar是一个轻量级的通知组件,用于向用户显示短暂的信息,通常出现在屏幕底部,并在一段时间后自动消失。"Flutter-Snackbar:颤抖小吃店"这个标题以一种幽默的方式将SnackBar与小吃店相联系,形象地...

    Node.js-对Toast和Snackbar的封装提高性能和用户体验

    2. Snackbar:相比于Toast,Snackbar提供了更多的功能,如包含一个操作按钮、可设置持续时间以及与用户界面的交互。Snackbar通常出现在屏幕底部,告知用户一些关键信息,并提供一个快速响应的选项。 在Node.js环境...

    SnackbarDemo

    可以通过`setAction()`方法为Snackbar添加一个可点击的操作按钮: ```java snackbar.setAction("撤销", new View.OnClickListener() { @Override public void onClick(View view) { // 操作按钮被点击时的逻辑 ...

    Android提醒微技巧你真的了解Dialog、Toast和Snackbar吗

    然而,如果短时间内连续触发多个Toast,可能会导致信息堆积,影响用户体验。因此,最佳实践是实现一个全局的Toast管理器,确保同一时间只有一个Toast显示。例如,创建一个静态方法`Util.showToast(Context context, ...

Global site tag (gtag.js) - Google Analytics