将先前存储的数据从 SharedPreferences 加载到 PreferenceFragment
Loading previously stored data from SharedPreferences into PreferenceFragment
我已经按照文档创建了偏好片段。我的所有首选项都按预期工作,但我有一个名字和姓氏设置,我想从 SharedPreferences 动态加载。这些值在用户登录时已经存储。
它们在 strings.xml 中的值:
<string name="first_name">first_name</string>
<string name="last_name">last_name</string>
它们在登录时被保存:
editor.putString(mContext.getResources().getString(R.string.first_name), firstName);
editor.putString(mContext.getResources().getString(R.string.last_name), lastName);
editor.commit();
preferences.xml中的偏好:
<EditTextPreference
android:key="@string/first_name"
android:inputType="text"
android:persistent="true"
android:title="First Name"/>
<EditTextPreference
android:key="@string/last_name"
android:inputType="text"
android:persistent="true"
android:title="Last Name"/>
正在尝试将它们加载到首选项片段中:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sessionManager = SessionManager.getInstance(getActivity());
addPreferencesFromResource(R.xml.preferences);
PreferenceManager.setDefaultValues(getActivity(), R.xml.preferences, false);
// Set first and last name preference default values
firstNamePreference = (EditTextPreference)findPreference("first_name");
lastNamePreference = (EditTextPreference)findPreference("last_name");
nearbyPreference = (CheckBoxPreference)findPreference("show_places");
// firstNamePreference.setText(sessionManager.getUserFirstName());
// firstNamePreference.setSummary(sessionManager.getUserFirstName());
// lastNamePreference.setText(sessionManager.getUserLastName());
// lastNamePreference.setSummary(sessionManager.getUserLastName());
nearbyPreference.setDefaultValue(true);
}
所以我可以手动设置它们(以及摘要),但我真的很想根据 SharedPreferences 中已经设置的值来设置它们。我该怎么做?
像这样的事情是您应该考虑做的事情:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
// Sets the first name based on the SharedPreference value
Preference pref = getPreferenceScreen().findPreference("first_name");
pref.setSummary(pref.getSharedPreferences().getString("first_name", "default value if first_name key not set"));
}
所以在查看我的代码后,我意识到我的应用程序将首选项存储在默认文件之外的文件中。所以,我不得不从 this 文章中执行以下操作:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
PreferenceManager.setDefaultValues(getActivity(), R.xml.preferences, false);
sharedPreferences = getActivity().getSharedPreferences("file_name", 0); // 0 is private
// show the current value in the settings screen
for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) {
pickPreferenceObject(getPreferenceScreen().getPreference(i));
}
}
private void pickPreferenceObject(Preference p) {
if (p instanceof PreferenceCategory) {
PreferenceCategory cat = (PreferenceCategory) p;
for (int i = 0; i < cat.getPreferenceCount(); i++) {
pickPreferenceObject(cat.getPreference(i));
}
} else {
initSummary(p);
}
}
private void initSummary(Preference p) {
if (p instanceof EditTextPreference) {
EditTextPreference editTextPref = (EditTextPreference) p;
String value = sharedPreferences.getString(editTextPref.getKey(), "");
p.setSummary(value);
((EditTextPreference) p).setText(value);
}
// More logic for ListPreference, etc...
}
否则,您可能只需使用默认首选项分别设置它们,访问方式如下:
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
我已经按照文档创建了偏好片段。我的所有首选项都按预期工作,但我有一个名字和姓氏设置,我想从 SharedPreferences 动态加载。这些值在用户登录时已经存储。
它们在 strings.xml 中的值:
<string name="first_name">first_name</string>
<string name="last_name">last_name</string>
它们在登录时被保存:
editor.putString(mContext.getResources().getString(R.string.first_name), firstName);
editor.putString(mContext.getResources().getString(R.string.last_name), lastName);
editor.commit();
preferences.xml中的偏好:
<EditTextPreference
android:key="@string/first_name"
android:inputType="text"
android:persistent="true"
android:title="First Name"/>
<EditTextPreference
android:key="@string/last_name"
android:inputType="text"
android:persistent="true"
android:title="Last Name"/>
正在尝试将它们加载到首选项片段中:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sessionManager = SessionManager.getInstance(getActivity());
addPreferencesFromResource(R.xml.preferences);
PreferenceManager.setDefaultValues(getActivity(), R.xml.preferences, false);
// Set first and last name preference default values
firstNamePreference = (EditTextPreference)findPreference("first_name");
lastNamePreference = (EditTextPreference)findPreference("last_name");
nearbyPreference = (CheckBoxPreference)findPreference("show_places");
// firstNamePreference.setText(sessionManager.getUserFirstName());
// firstNamePreference.setSummary(sessionManager.getUserFirstName());
// lastNamePreference.setText(sessionManager.getUserLastName());
// lastNamePreference.setSummary(sessionManager.getUserLastName());
nearbyPreference.setDefaultValue(true);
}
所以我可以手动设置它们(以及摘要),但我真的很想根据 SharedPreferences 中已经设置的值来设置它们。我该怎么做?
像这样的事情是您应该考虑做的事情:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
// Sets the first name based on the SharedPreference value
Preference pref = getPreferenceScreen().findPreference("first_name");
pref.setSummary(pref.getSharedPreferences().getString("first_name", "default value if first_name key not set"));
}
所以在查看我的代码后,我意识到我的应用程序将首选项存储在默认文件之外的文件中。所以,我不得不从 this 文章中执行以下操作:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
PreferenceManager.setDefaultValues(getActivity(), R.xml.preferences, false);
sharedPreferences = getActivity().getSharedPreferences("file_name", 0); // 0 is private
// show the current value in the settings screen
for (int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) {
pickPreferenceObject(getPreferenceScreen().getPreference(i));
}
}
private void pickPreferenceObject(Preference p) {
if (p instanceof PreferenceCategory) {
PreferenceCategory cat = (PreferenceCategory) p;
for (int i = 0; i < cat.getPreferenceCount(); i++) {
pickPreferenceObject(cat.getPreference(i));
}
} else {
initSummary(p);
}
}
private void initSummary(Preference p) {
if (p instanceof EditTextPreference) {
EditTextPreference editTextPref = (EditTextPreference) p;
String value = sharedPreferences.getString(editTextPref.getKey(), "");
p.setSummary(value);
((EditTextPreference) p).setText(value);
}
// More logic for ListPreference, etc...
}
否则,您可能只需使用默认首选项分别设置它们,访问方式如下:
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());