java - 手动设置的 Android 首选项不会在设置活动中加载
问题描述
我想从构建变量中播种我的应用程序的默认首选项,因此我不能使用基于 XML 的首选项默认值。
在我的MainActivity
,我有这个方法:
/**
* Set the default values programmatically
*/
protected void initPreferences() {
SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
if (sharedPref.getString("elasticsearch_url", "").equals("")) {
editor.putString("elasticsearch_url", Env.elasticsearchTestUrl);
}
if (sharedPref.getString("elasticsearch_user", "").equals("")) {
editor.putString("elasticsearch_user", Env.elasticsearchTestUser);
}
if (sharedPref.getString("elasticsearch_password", "").equals("")) {
editor.putString("elasticsearch_password", Env.elasticsearchTestPassword);
}
if (sharedPref.getString("elasticsearch_index", "").equals("")) {
editor.putString("elasticsearch_index", Env.elasticsearchTestIndex);
}
editor.commit();
Log.d(TAG, "Settings: " + sharedPref.getAll());
}
我onCreate
在应用程序启动后直接调用它。日志显示设置保存良好。
现在,我有第二个活动,一个自动生成的SettingsActivity
,如下所示:
package com.aveq.testandroidpacketcapture;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceFragmentCompat;
public class SettingsActivity extends AppCompatActivity {
private static final String TAG = "SettingsActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings_activity);
if (savedInstanceState == null) {
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.settings, new SettingsFragment())
.commit();
}
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(false);
}
}
public static class SettingsFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
Log.d(TAG, "Setting preferences from XML resource ...");
setPreferencesFromResource(R.xml.root_preferences, rootKey);
}
}
}
每当我通过以下方式开始此活动时:
Intent intent = new Intent(this, SettingsActivity.class);
startActivityForResult(intent, 0);
设置活动打开,但那里的值是空的:
加载首选项所基于的 XML 如下所示:
<PreferenceScreen
xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceCategory
app:title="Elasticsearch">
<EditTextPreference
app:key="elasticsearch_url"
app:title="Elasticsearch URL"
app:useSimpleSummaryProvider="true"/>
<EditTextPreference
app:key="elasticsearch_user"
app:title="Elasticsearch username"
app:useSimpleSummaryProvider="true"/>
<EditTextPreference
app:key="elasticsearch_password"
app:title="Elasticsearch password"
app:useSimpleSummaryProvider="true"/>
<EditTextPreference
app:key="elasticsearch_index"
app:title="Elasticsearch index"
app:useSimpleSummaryProvider="true"/>
</PreferenceCategory>
</PreferenceScreen>
据我所知,所有的键都匹配。当我在设置活动的方法中记录共享首选项时onCreate
,它们是正确的,那么为什么我的值没有加载?
解决方案
使用 PreferenceScreen 时,SharedPreferences 会保存到默认的共享首选项中,因此您需要从那里获取它们
PreferenceManager.getDefaultSharedPreferences(this)
与将它们从私人环境中拉出来
getPreferences(Context.MODE_PRIVATE)
推荐阅读
- angular - 角度中没有将“exportAs”设置为“ngForm”的指令
- vb.net - 如何解决错误:“列名或提供的值的数量与表定义不匹配”?
- kubernetes - AKS cilium 单节点集群不接受连接
- javascript - RangeError:超过最大调用大小,创建条带会话
- php - 拉拉维尔。如果数据库正在播种,则禁用观察者方法
- javascript - 在 JQuery 中从 JSON 中过滤子字符串
- excel - waitForResponse 方法不适用于 XMLHTTP
- reactjs - 如何在不同的反应应用程序之间共享节点模块文件夹
- arrays - 如何在本机反应中循环返回多张卡
- angular - 如何在 Angular 11 中从 Angular Material CDK 调用 CdkTable 上的“renderRows”