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 而不会扩展 PreferenceFragmentCompat
或 PrefereceActivity
编辑
我从 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));
在我的应用程序中,我有一个 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 而不会扩展 PreferenceFragmentCompat
或 PrefereceActivity
编辑
我从 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));