【问题标题】:How to use setDuration() method in SnackBar (Android Design Support Library)如何在 SnackBar 中使用 setDuration() 方法(Android 设计支持库)
【发布时间】:2015-08-13 13:44:07
【问题描述】:

来自文档:参数持续时间 - 可以是预定义长度之一:LENGTH_SHORT、LENGTH_LONG、或以毫秒为单位的自定义持续时间。 但我无法设置自定义持续时间。

例如

Snackbar
    .make(parentLayout, "Feed cat?", 8000) // try here
    .setAction("Yes", snackOnClickListener)
    .setActionTextColor(Color.MAGENTA)
    .setDuration(8000) // try here
    .show();

但是 Snackbar 不是 8 秒很快就消失了。

【问题讨论】:

  • “我无法设置自定义持续时间”是什么意思?您的具体症状是什么?
  • @CommonsWare 他的意思是,他无法设置自定义持续时间。它只需要 Length.Long 和 Length.Short。输出“必须是以下之一:Snackbar.LENGTH_SHORT, Snackbar.LENGTH_LONG” 文档指出可以以毫秒为单位设置自定义持续时间。我相信这是图书馆的一个错误,可能会被修复。我尝试了许多不同的方法,但无法找到解决方案。如果您可以破解并找到并回答,请发布。 developer.android.com/reference/android/support/design/widget/…
  • @EugeneH:你是对的;这是一个错误。请参阅下面的答案。
  • 我也有这个问题。我使用 LENGTH_LONG 但问题没有解决,并且小吃店在第三秒关闭......
  • 使用此链接.. technotalkative.com/part-2-welcome-snackbar-goodbye-toast 这是@pareshMayani GDG 创始人的完整演示

标签: android android-design-library snackbar


【解决方案1】:

基于SnackbarSnackbarManager的实现,我可以确认Eugene H的评估:这是一个bug。来自SnackbarManager

private void scheduleTimeoutLocked(SnackbarRecord r) {
    mHandler.removeCallbacksAndMessages(r);
    mHandler.sendMessageDelayed(Message.obtain(mHandler, MSG_TIMEOUT, r),
            r.duration == Snackbar.LENGTH_LONG
                    ? LONG_DURATION_MS
                    : SHORT_DURATION_MS);
}

因此,任何不是LENGTH_LONG 的值都会导致一个短时间的snackbar。

我已为此提交了an issue

编辑:已在修订版 22.2.1 中修复。查看发行说明here

android 文档尚未更新,但如果您跳入源代码,您会注意到方法 setDuration(int duration) 的参数可以是 LENGTH_SHORT、LENGTH_LONG 之一, LENGTH_INDEFINITE 或以毫秒为单位的自定义持续时间

【讨论】:

  • @ScottW:“你在哪里找到源代码的?” -- ...我从石头上拔出剑,然后湖中的女士吟诵道:“对不起,整个英国国王的事情都是一次性的;我可以让你对一些跨国公司的源代码感兴趣吗? ?”。或者,我可能通过 SDK 管理器下载了源代码。相信你想要的。 :-) “我很想知道 LONG_DURATION_MS 和 SHORT_DURATION_MS 的值”——分别是 1500 和 2750。
  • @ScottW:“我看过的地方(AOSP,下载管理器中的源代码)似乎没有 Snackbar 或 SnackbarManager 类。” -- 在我的机器上,它在$ANDROID_SDK/sources/android-MNC/android/support/design/widget/SnackbarManager.java
  • @ScottW:很高兴你找到了它,我同样很高兴你相信亚瑟王神话!不过,对于将来偶然发现此问题的任何人,请快速注意——我在评论中将这两个数字颠倒了。长时2750,短时1500。
  • 看起来这个问题已经在 M 的 Preview 2 中得到修复,但该修复尚未在设计支持库中发布。
  • 在 22.2.1 中可以设置自定义持续时间,但我不得不禁用 setDuration 方法的 lint 检查,因为它给出了错误(检查尚未正确更新)。
【解决方案2】:

将初始持续时间设置为 LENGTH_INDEFINITE,然后设置您的自定义持续时间:

Snackbar
.make(parentLayout, "Feed cat?", Snackbar.LENGTH_INDEFINITE)
.setAction("Yes", snackOnClickListener)
.setActionTextColor(Color.MAGENTA)
.setDuration(8000)
.show();

编辑

现在可以直接以毫秒为单位设置周期;

Snackbar
.make(parentLayout, "Feed cat?", 8000)
.setAction("Yes", snackOnClickListener)
.setActionTextColor(Color.MAGENTA)
.show();

【讨论】:

  • 如果我们使用 8000,Android 编译。但如果我们设置一个常数 (DURATION = 8000),它不会编译。针对这种情况写@SuppressLint("WrongConstant")
【解决方案3】:

'com.android.support:design:22.2.1'

您可以将 Snackbar 的持续时间设置为 LENGTH_INDEFINITE这将使 Snackbar 一直显示,直到它被关闭或显示另一个 Snackbar。

【讨论】:

    【解决方案4】:

    这段代码非常适合我试试这个

    Snackbar.make(view, "Hello SnackBar", Snackbar.LENGTH_LONG)
            .setAction("Its Roy", new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                }
            })
            .setDuration(10000)
            .setActionTextColor(getResources().getColor(R.color.colorAccent))
            .show();
    

    【讨论】:

    • 在 Android M 上工作。谢谢
    • 也适用于 Android Q,这应该是可以接受的答案。
    【解决方案5】:

    好像已经修复了

    compile 'com.android.support:design:22.2.1'
    

    只有 Lint 显示它带有红色下划线,但它可以工作。

    【讨论】:

    • 是的,对我来说也是如此。这很奇怪。我正在使用 v23.1.1
    • 添加 //noinspection WrongConstant 关闭 Lint,它应该可以正常工作
    【解决方案6】:

    我为此创建了一个解决方法,我创建了一个使用处理程序和 postDelayed 设置具有自定义持续时间的小吃店的类:

    public class SnackBarMaker {
    
    public static void snack(View content, String message, String actionText,  int actionTextColor, View.OnClickListener onClick){
        Snackbar.make(content, message, Snackbar.LENGTH_LONG)
                .setAction(actionText, onClick)
                .setActionTextColor(actionTextColor)
                .show();
    }
    
    public static void snackWithCustomTiming(View content, String message, int duration){
        final Snackbar snackbar = Snackbar.make(content, message, Snackbar.LENGTH_INDEFINITE);
        snackbar.show();
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                snackbar.dismiss();
            }
        },duration);
    }
    }
    

    这样使用:

      //your duration
       int duration = 4000 
    SnackBarMaker.snackWithCustomTiming(getActivity().findViewById(android.R.id.content)
                                                   , getString(R.string.your_message), duration);
    

    【讨论】:

      【解决方案7】:

      你好,试试这个外部库 https://github.com/nispok/snackbar。 它已被弃用,但它可以轻松解决您的问题。此外,它易于实施。在支持库之前,我仅将此库用于小吃店。由于支持库的持续时间问题,我很高兴只使用这个库。

      【讨论】:

        猜你喜欢
        • 2015-10-19
        • 1970-01-01
        • 2015-11-18
        • 1970-01-01
        • 1970-01-01
        • 2016-05-09
        • 2015-08-21
        • 1970-01-01
        • 2015-09-14
        相关资源
        最近更新 更多