首页 > 解决方案 > Activity 重新创建之前未显示 Android SnackBar

问题描述

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

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

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

到目前为止,我使用了 Toast 并且效果很好,但是从 Android 11 开始,不推荐使用自定义 Toast 视图,建议使用 SnackBars。

但是 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?

标签: androidsnackbar

解决方案


感谢@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);
        }

推荐阅读