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

时间:2015-05-30 20:01:36

标签: android android-design-library snackbar

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

例如

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

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

5 个答案:

答案 0 :(得分:58)

根据SnackbarSnackbarManager的实施情况,我可以确认Eugene 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);
}

因此,任何不是LENGTH_LONG的值都会导致短期小吃吧。

我已经提交了an issue

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

Android文档已经 NOT 已更新,但是如果你跳转到源代码,你会注意到方法setDuration(int duration)的参数可以是LENGTH_SHORT,LENGTH_LONG之一, LENGTH_INDEFINITE 或自定义持续时间(以毫秒为单位)

答案 1 :(得分:14)

将初始持续时间设置为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();

答案 2 :(得分:6)

似乎已修复

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

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

答案 3 :(得分: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);
}
}

像这样使用:

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

答案 4 :(得分:3)

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

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();