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

oprakyz7  于 2022-11-27  发布在  Android
关注(0)|答案(8)|浏览(176)

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

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

但小吃店很快就消失了。

vmdwslir

vmdwslir1#

基于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);
}

因此,任何不是LENGTH_LONG的值都会导致一个持续时间较短的snackbar。
我已经把它归档了。

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

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

rvpgvaaj

rvpgvaaj2#

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

ohtdti5x3#

'com.android.support:design:22.2.1'开始
您可以将小吃条的持续时间设置为LENGTH_INDEFINITE,它将使小吃条显示,直到它被解散或另一个小吃条显示。

9wbgstp7

9wbgstp74#

这段代码对我来说非常有效试试这个

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

nukf8bse5#

它似乎固定在

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

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

ars1skjm

ars1skjm6#

我已经创建了一个解决方案,我做了一个类,使用handler和postDelayed设置snackbars的自定义持续时间:

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

gkn4icbw7#

你好,给予这个外部库https://github.com/nispok/snackbar。它已经过时了,但是它可以很容易地解决你的问题。而且它很容易实现。在支持库之前,我只在小吃店使用这个库。由于支持库的持续时间问题,我很高兴只使用这个库。

zlhcx6iw

zlhcx6iw8#

在2022年,AndroidX仍然可以实现这一解决方案:https://stackoverflow.com/a/44009407/7699617
只需将持续时间(单位:ms)直接设置为make函数:

Snackbar.make(context, messageId, DISMISS_TIMEOUT)
        .setAction(actionId, actionListener)
        .addCallback(dismissCallback)
        .show()

const val DISMISS_TIMEOUT = 6000

另外,我做了一些计算,找出默认持续时间值

  • Snackbar.LENGTH_LONG ~ 3000毫秒
  • Snackbar.LENGTH_SHORT ~ 2000毫秒

相关问题