如何在SnackBar中使用setDuration()方法(Android设计支持库)

teh*_*log 51 android snackbar android-design-library

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

例如

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

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

Com*_*are 60

根据实施SnackbarSnackbarManager,我可以证实尤金H公司的评价:这是一个错误.来自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);
}
Run Code Online (Sandbox Code Playgroud)

因此,任何不会LENGTH_LONG导致短期快餐栏的价值.

我已就此提出了一个问题.

编辑:已在修订版22.2.1中修复.请查看此处的发行说明

Android的文档已被尚未更新,但如果你跳进源代码,你会发现,该参数的方法setDuration(INT持续时间)可以是LENGTH_SHORT,LENGTH_LONG,一个LENGTH_INDEFINITE或以毫秒为单位的自定义时间

  • 在22.2.1中,可以设置自定义持续时间,但我必须禁用setDuration方法的lint检查,因为它给出了错误(检查尚未正确更新). (7认同)
  • @ScottW:"你在哪里找到源代码?" - ......然后我从石头上拔出剑,然后湖中的夫人吟唱着"对不起,但整个英国国王的事情是一次性的交易;我可以感兴趣的是一些MNC源代码?".或者,我可能通过SDK Manager下载了源代码.相信你想要的.:-)"我想知道LONG_DURATION_MS和SHORT_DURATION_MS的值" - 分别为1500和2750. (4认同)
  • @ScottW:"我看过的地方(AOSP,下载管理器中的源代码)似乎没有Snackbar或SnackbarManager类." - 在我的机器上,它位于`$ ANDROID_SDK/sources/android-MNC/android/support/design/widget/SnackbarManager.java`中. (3认同)
  • @ScottW:很高兴你找到了它,我同样很高兴你相信亚瑟王神话!但是,对于未来偶然发现这种情况的人来说,请注意 - 我的评论中有两个数字相反.持续时间长达2750,持续时间为1500. (2认同)

Jim*_*mau 19

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

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

编辑

直接以毫秒为单位设置句点现在可以正常工作;

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


Muh*_*ifi 9

以来 'com.android.support:design:22.2.1'

你可以设置Snackbar的持续时间,LENGTH_INDEFINITE直到它被解散或显示另一个零食栏为止.


kun*_*roy 7

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

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();
Run Code Online (Sandbox Code Playgroud)


小智 6

似乎是固定的

compile 'com.android.support:design:22.2.1'
Run Code Online (Sandbox Code Playgroud)

只有Lint显示红色下划线,但它有效.


Ziv*_*ten 5

我为此创建了一个解决方案,我创建了一个类,使用handler和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);
}
}
Run Code Online (Sandbox Code Playgroud)

像这样使用:

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