java - Activity 之间的 Android SharedPreferences 只加载 defValue
问题描述
我有一个简单的问题。我找不到在我的活动之间使用 sharedPreferences 的方法。其中一个是 Settingsactivity,另一个是我的 MainActivity。我想将 SettingsActivity 中的变量(show_idle_dialog 和 selected_currency)保存到 sharedPreferences 并将其加载到 MainActivity。使用我当前的代码,MainActivity 总是加载 defValue。
设置活动:
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
public class SettingsActivity extends AppCompatActivity {
public static final String KEY_PREF_CHECK_BOX_SHOW_IDLE_DIALOG = "check_box_show_idle_dialog";
public static final String KEY_PREF_CURRENCY_DROPDOWN = "currency_dropdown";
Boolean show_idle_dialog;
String selected_currency;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportFragmentManager().beginTransaction()
.replace(android.R.id.content, new SettingsFragment())
.commit();
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
show_idle_dialog = sharedPreferences.getBoolean(SettingsActivity.KEY_PREF_CHECK_BOX_SHOW_IDLE_DIALOG, true);
selected_currency = sharedPreferences.getString(SettingsActivity.KEY_PREF_CURRENCY_DROPDOWN, "currency_eur");
Log.i("abc", "put " + show_idle_dialog);
Log.i("abc", "put " + selected_currency);
}
}
主要活动:
public class MainActivity extends AppCompatActivity {
public static final String SHARED_PREFS = "sharedPrefs";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
PreferenceManager.setDefaultValues(this, R.xml.root_preferences, false);
}
@Override
public void onResume(){
loadData();
super.onResume();
}
public void loadData(){
SharedPreferences sharedPreferences = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE);
show_idle_dialog = sharedPreferences.getBoolean(SettingsActivity.KEY_PREF_CHECK_BOX_SHOW_IDLE_DIALOG, false);
selected_currency = sharedPreferences.getString(SettingsActivity.KEY_PREF_CURRENCY_DROPDOWN, "currency_eur");
Log.i("abc", "got " + show_idle_dialog);
Log.i("abc", "got " + selected_currency);
}
如果有人知道我做错了什么,我会很高兴。
解决方案
您正在尝试从 SettingsActivity 中的共享首选项中获取价值。
要在共享偏好中节省价值,您可以执行以下操作:
SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
// Writing data to SharedPreferences
Editor editor = settings.edit();
editor.putString("key", "some value");
editor.commit();
所以你需要在 SettingsActivity 中做的是:
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
// Writing data to SharedPreferences
Editor editor = sharedPreferences .edit();
editor.putString(SettingsActivity.KEY_PREF_CURRENCY_DROPDOWN, <your-string-value>);
editor.putBoolean(SettingsActivity.KEY_PREF_CHECK_BOX_SHOW_IDLE_DIALOG, <your-boolean-value>)
editor.commit();
推荐阅读
- python-3.x - 在 al 列中查找最常见的字符串
- mysql - Node.js 与 knex + Mysql 迁移错误,而重命名列导致默认值
- c# - Asp.net Core 如何将 ReflectionIT 与 ViewModel 一起使用?
- angularjs - 从 AngularJs 转换为 Angular 2+
- database - 我应该使用 InfluxDB 或 Elasticsearch 或其他方法来存储网站的鼠标跟踪数据吗?
- javascript - Javascript regexp - 删除引号之间的空格
- angular - VSCode 终端中的“Ctrl + 单击以跟随链接”不会跳转到源文件但会打开新的浏览器选项卡
- php - 多维数组,同一个key的值求和
- ansible - 是否有一个 Ansible 模块可以帮助在启动后保存 iptables 配置
- php - 如何获取从未完成的数据