【问题标题】:Android SnackBar not shown before Activity recreateActivity 重新创建之前未显示 Android SnackBar
【发布时间】:2021-02-08 00:05:39
【问题描述】:

在我的 android 应用程序中,我有一个按钮,可以更改语言。

单击按钮后,将重新创建活动以应用语言更改。

我需要通过 SnackBar 向用户显示语言已更改的消息。

到目前为止,我使用了 Toast,它运行良好,但从 Android 11 开始,自定义 Toast 视图已被弃用,建议使用 SnackBar。

但是 SnackBar 不会持续存在,因此不会显示,因为该活动会立即重新创建。

    public void ClickLang(View view)
{
    String lng = readLang();
    String tx;String newlng;

    ImageView language = findViewById(R.id.lang);
    if (lng.equals("sk")) {
        language.setImageResource(R.drawable.sk);
        newlng = "en"; tx="English language";
    }
    else {
        language.setImageResource(R.drawable.en);
        newlng = "sk"; tx="Slovenský jazyk";

   }

    showMsgSnack(tx);
    saveLang(newlng);

}

public void showMsgSnack(String msg) {
    View parentLayout = findViewById(android.R.id.content);
    Snackbar snackbar = Snackbar.make(parentLayout, msg, Snackbar.LENGTH_SHORT);
    snackbar.show();
}

private void saveLang(String lng) {
    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
    sharedPreferences.edit().putString("hrad_lang", lng).apply();

    super.recreate();
}

如果我删除 super.recreate();,SnackBar 会出现,但 lang 没有改变,所以我需要它。

有没有解决办法,如何在重新创建之前显示 SnackBar?

【问题讨论】:

  • 我认为 onSaveInstanceState 可以帮你解决这个问题。
  • 谢谢你,我试过了,似乎有效,我们希望这条消息只会出现在这种情况下。由于我在整个活动中只有一个重新创建,我认为它应该可以工作。我在答案中发布了我的代码。也许还有其他方法,例如创建一个计时器,并且只有在重新创建之后,所以消息不会消失,但现在我保留 onSaveInstanceState 解决方案

标签: android snackbar


【解决方案1】:

感谢@Manuel Mato,onSaveInstanceState 似乎有效:

 protected void onSaveInstanceState( @NonNull Bundle texto) {
        super.onSaveInstanceState(texto);
        String lng = readLang();
        texto.putString("showlng", lng);
    }

在 onCreate 中:

 @Override
    protected void onCreate(Bundle texto) {
        super.onCreate(texto);
        if (texto != null){String tx;
            String tt = texto.getString("showlng");
            assert tt != null;
            if (tt.equals("sk")) { tx = "Slovenský jazyk";} else { tx = "English language";}
            showMsgSnack(tx);
        }

【讨论】:

    【解决方案2】:

    最好使用恢复状态的方法,并给之前的答案打分,谢谢

    【讨论】:

    • 据我所知,也可以在 onRestoreInstanceState() 中恢复它,但不是很常见。 (onRestoreInstanceState() 在 onStart() 之后调用,而 onCreate() 在 onStart() 之前调用。也许你能解释一下原因,所以我们都可以在这里得到一个很好的答案。我将你的评论标记为有用,但它只是评论,不回答,所以我不能投票给它作为答案。请编辑最后一篇文章并把你的完整答案放在那里,然后我会标记它
    • 我更喜欢使用 onRestoreInstanceState 的原生方式,因为我不知道在某些情况下它是否会在 Android 框架中出现一些错误或更改。而且我认为计时器不是一个好主意,因为计时器的时间不是真实的。并且要小心处理方法,可能需要保存另一个参数,例如isNecessaryShowSnackBar,因为系统从App Stack中销毁了活动,然后会出现此消息。
    • 那么也许我根本不需要使用 onSaveInstanceState。在我的 saveLang(String lng) 函数中,我将 SharedPreferences 的另一个参数设置为 true,在 onCreate 中我只是检查它是否为 true,然后显示小吃栏。所以它只会在该参数为真时显示 - 这意味着只有在语言发生变化时
    • 是的,是另一种选择...但我个人认为,用户体验很奇怪,当用户更改语言时不需要反馈,因为用户立即看到更改...例如,一些重要的应用程序有这种行为吗?所以也许这个反馈不是必需的,但你的应用程序,是你的决定。
    • 是的,你是对的,会考虑的。正如您所写,用户会立即看到更改。感谢您的所有建议和帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多