android - 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?
解决方案
感谢@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);
}
推荐阅读
- c# - 每次测试都需要此步骤时如何登录页面进行管理
- python - 使用 Python 从音频文件中提取 F0、抖动和闪光
- symfony - 解析 YAML 时出错,文件无效“C:\wamp64\www\swapp/translations\date.it.yml”
- java - 测试抛出 NullPointerException 而不是 RandomCustomException,但仅在某些环境中
- c# - 从 C# 中的配置文件读取保持顺序的键值对
- php - PHP 在新标签页中打开链接
- scala - 我们有两个列表需要使用 spark scala 过滤第二个列表与第一个列表比较
- python-3.4 - Py2exe - PyOpenSSL 错误:超出最大递归深度
- regex - vim中可以使用递归正则化吗?
- c++ - 解析时 std::wistringstream 可以忽略字符串中的空格吗?