首页 > 解决方案 > 手动设置的 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,它们是正确的,那么为什么我的值没有加载?

标签: javaandroid

解决方案


使用 PreferenceScreen 时,SharedPreferences 会保存到默认的共享首选项中,因此您需要从那里获取它们

PreferenceManager.getDefaultSharedPreferences(this)

与将它们从私人环境中拉出来

getPreferences(Context.MODE_PRIVATE)

推荐阅读