Android ListPreference 条目文本而不是 Activity 中的条目值或未扩展 PreferenceFragment 的片段

Android ListPreference entry text instead of entry value from Activity or Fragment that doesn't extend PreferenceFragment

在我的应用程序中,我有一个 SettingsFragment extends PreferenceFragmentCompat

在此设置中,我有一个 ListPreference 动态生成的 HTTP 调用,该调用接收 JSON 个值。

现在的问题是,当我从 MainActivity 中获取存储到 SharedPreference 中的值时,我得到了 android.entries 但我没有找到获取 entryValues 的方法。

我发现我可以使用 getEntry() 方法从 SettingsFragment:

获取条目
ListPreference listPreference = (ListPreference)
findPreference("entry_preference");
String entry = listPreference.getEntry();

但这只适用于 SettingsFragment....我怎样才能从 MainActivity 获得 selected 条目而不是 entryValues?

sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
//This will return the value, but i need the entry text
String entry_settings = sharedPref.getString("entry_preference", "-1");

该代码将 return -1,但我不需要条目:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- dynamically generated by reading values from server -->
    <string-array name="entry_names_array">
        <item>No Entry</item>
    </string-array>

    <!-- dynamically generated by reading values from server -->
    <string-array name="entry_values_array">
        <item>-1</item>
    </string-array>
</resources>

我如何将这个值放入 MainActivity,或者更一般地说,如何将这个值放入 Activity/Fragment 而不会扩展 PreferenceFragmentCompatPrefereceActivity

编辑

我从 MainActivity 看到 sharedPref 对象有 2 个键:

SharedPreference sharedPref = PreferenceManager.getDefaultSharedPreferences(this);

它包含键 entry_preference,它是 ListPreference 的键:

   <ListPreference
        android:key="entry_preference"
        android:entries="@array/entry_names_array"
        android:entryValues="@array/entry_values_array"
        android:summary="%s"
        android:title="@string/listpref_entry_settings_title" />

和另一个键"entry",但是这个键return与"entry_preference"的值相同。

我写错了或者键"entry" return和entry_preference的值一样是正常的?

编辑 2 - 可能的答案

现在我将条目保存在 SharedPreference 中,这样我就可以通过读取它从 MainActivity 中获取它。 我不知道这样做是否是个好方法,但这里是代码。

1) 使用 OnSharedPreferenceChangeListener 检查用户何时 select 另一个选择并将其存储到 SharedPreference

public class SettingsFragment extends PreferenceFragmentCompat  {
    private static final String TAG = "SettingsFragment";
    private SharedPreferences sharedPref;
    private SharedPreferences.OnSharedPreferenceChangeListener prefListener;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sharedPref = PreferenceManager.getDefaultSharedPreferences(getContext());
        setEntracesUrl();
        requestForEntrancesToServer();

        prefListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
            public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
                Log.i(TAG, "Settings key changed: " + key);
                ListPreference listPreferenceEntrances = (ListPreference) findPreference("entry_preference");
                String currentEntry = (String) listPreferenceEntrances.getEntry();
                listPreferenceEntrances.setSummary(currentEntry);
                //Write the currentEntry into SharedPreferences
                SharedPreferences.Editor editor = sharedPref.edit();
                editor.putString(getString(R.string.current_listpreference_entry_key), currentEntry);
                editor.commit();
            }
        };
        sharedPref.registerOnSharedPreferenceChangeListener(prefListener);
    }
}

2) 我从 http 请求接收到创建 ListPreference 的值,所以我需要注意条目、条目值和摘要

 // Code inside method evaluateJSONObject() that evaluate JSON received 
 //from http request to server that return the values for ListPreference
 String currentEntry = (String) listPreferenceEntrances.getEntry();
 listPreferenceEntrances.setEntries(entries);
 listPreferenceEntrances.setEntryValues(entryValues);
 listPreferenceEntrances.setSummary(currentEntry);
 //Write the currentEntry into SharedPreferences
 SharedPreferences.Editor editor = sharedPref.edit();
 editor.putString(getString(R.string.current_listpreference_entry_key), currentEntry);
 editor.commit();

3) 最后,在我的 MainActivity 的 onCreate 中,我读取了 sharedPreferences 并使用条目文本设置了 Textview:

   //SharedPreference instance
    sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
    setBaseUrl();

    // This show the string entry VALUE of selected ListPreference
    String entry_settings_id = sharedPref
            .getString("entry_preference", "-1");
    // This show the string entry of selected ListPreference
    String entry_settings_name = sharedPref
            .getString(
                    getString(R.string.current_listpreference_entry_key),
                    getString(R.string.current_listpreference_entry_default_value));

如果有更好的方法来满足我的需求,请告诉我! 谢谢

除非没有更好的方法,否则我会 post 我的 answare 也许其他人可以使用它。

1) 使用 OnSharedPreferenceChangeListener 检查用户何时 select 另一个选择并将其存储到 SharedPreference

public class SettingsFragment extends PreferenceFragmentCompat  {
    private static final String TAG = "SettingsFragment";
    private SharedPreferences sharedPref;
    private SharedPreferences.OnSharedPreferenceChangeListener prefListener;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sharedPref = PreferenceManager.getDefaultSharedPreferences(getContext());
        setEntracesUrl();
        requestForEntrancesToServer();

        prefListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
            public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
                Log.i(TAG, "Settings key changed: " + key);
               //Use a switch or else case that avoid loop call of OnSharedPreferenceChangeListner()
                switch(key) {
                    case "entry_preference":
                        ListPreference listPreferenceEntrances = (ListPreference) findPreference("entry_preference");
                        String currentEntry = (String) listPreferenceEntrances.getEntry();
                        listPreferenceEntrances.setSummary(currentEntry);
                        //Write the currentEntry into SharedPreferences
                        SharedPreferences.Editor editor = sharedPref.edit();
                    editor.putString(getString(R.string.current_listpreference_entry_key), currentEntry);
                        editor.commit();
                    break;
               default:
                    break;
              }
            }
        };
        sharedPref.registerOnSharedPreferenceChangeListener(prefListener);
    }
}

2) 我从 http 请求接收到创建 ListPreference 的值,所以我需要注意条目、条目值和摘要

 // Code inside method evaluateJSONObject() that evaluate JSON received 
 //from http request to server that return the values for ListPreference
 String currentEntry = (String) listPreferenceEntrances.getEntry();
 listPreferenceEntrances.setEntries(entries);
 listPreferenceEntrances.setEntryValues(entryValues);
 listPreferenceEntrances.setSummary(currentEntry);
 //Write the currentEntry into SharedPreferences
 SharedPreferences.Editor editor = sharedPref.edit();
 editor.putString(getString(R.string.current_listpreference_entry_key), currentEntry);
 editor.commit();

3) 最后,在我的 MainActivity 的 onCreate 中,我读取了 sharedPreferences 并使用条目文本设置了 Textview:

   //SharedPreference instance
    sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
    setBaseUrl();

    // This show the string entry VALUE of selected ListPreference
    String entry_settings_id = sharedPref
            .getString("entry_preference", "-1");
    // This show the string entry of selected ListPreference
    String entry_settings_name = sharedPref
            .getString(
                    getString(R.string.current_listpreference_entry_key),
                    getString(R.string.current_listpreference_entry_default_value));