更改现有 snackBar 的文本

5
我希望在我的token失效时显示一个snackBar。该snackBar将附有一个“刷新”token的操作。
SnackBar outerSnackBar;

outerSnackBar =  Snackbar.make(coordinatorLayout, 
"Your request is unauthorized. Please refresh your token", 
Snackbar.LENGTH_INDEFINITE).setAction("Refresh"), new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                outerSnackBar.setAction("", null);
                                outerSnackBar.setText("Refreshing");
                                outerSnackBar.show();
   }
}).show();

当我点击 snackBar 的 "刷新" 操作按钮时,我希望现有的 snackBar 文本更改为 "正在刷新",并显示操作。这是我在 onClickListener 中编写的代码。
然而,当我点击 "刷新" 操作按钮时,snackbar 只会自动关闭。
有没有办法修改现有 snackbar 的文本和操作?
5个回答

6

我曾经用以下代码获取并设置文本:

TextView snackBarText =  snackbar.getView().findViewById(android.support.design.R.id.snackbar_text); 
snackBarText.setText("Stackoverflow is cool!");

但现在使用AndroidX,这是获取视图的正确方式:

TextView snackBarText =  snackbar.getView().findViewById(com.google.android.material.R.id.snackbar_text); 

Snackbar已经有一个setText方法,但没有getter,您可以使用您提到的方式获取当前文本并在其上附加。 - LutfiTekin

3

如果只想更改文本,请获取 Snackbar 的 TextView:

TextView tvSnackbarText =  snackbar.getView().findViewById(android.support.design.R.id.snackbar_text); 
tvSnackbarText.setText("Any text");

您提到了“...和显示的操作”,因此这些都是不必要的:
outerSnackBar.setAction("", null);
outerSnackBar.show();

这里还有其他有用的方法如何将支持库snackbar文本颜色设置为非android:textColor颜色?


2
最好用新的SnackBar显示消息“正在刷新”。
 SnackBar outerSnackBar =  Snackbar.make(coordinatorLayout, 
    "Your request is unauthorized. Please refresh your token", 
    Snackbar.LENGTH_INDEFINITE).setAction("Refresh"), new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                    Snackbar refreshingSnackBar = Snackbar
                                           .make(coordinatorLayout, "Refreshing...",
                                            Snackbar.LENGTH_SHORT);
                                    refreshingSnackBar.show();
       }
    }).show(); 

2

只需使用Snackbar.setText

无需手动搜索内部文本视图,这种方法非常不专业。

snackbar.setText("New Snackbar Message")

正如您所提到的,它似乎无法关闭SnackBar


1

这是一个更改文本和颜色的示例解决方案。

Snackbar snack = Snakebar.make(parent, "first text", Snackbar.LENGTH_INDEFINITE);

//change text when snackbar is showing

snack.setText("new different text")

//change color when snackbar is showing

snack.getView().setBackgroundColor(ContextCompat.getColor(context, R.color.green);

注意,'绿色'颜色必须在colors.xml文件中定义,例如:

<color name="green">#4CAF50</color>

1
重要的是要注意Snackbar必须处于显示状态。如果它被关闭并且您在设置文本后再次显示它,它将不会显示文本。 - Gilbert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接