共享preferences不保存,无需重新启动应用程序 [英] SharedPreferences not saving without restarting app
问题描述
什么code是用来检测应用程序运行时,在共享preferences所做的任何更改?
在我的共享preferences所做的更改,当应用程序被关闭并重新启动只反映。它不会被同一个会话过程中改变。
要取我用下面的code中的preferences
在SettingsActivity.java
@覆盖
公共无效的onCreate(捆绑savedInstanceState)
{
super.onCreate(savedInstanceState);
加preferencesFromResource(R.xml pref_general);
绑定preferenceSummaryToValue(找到preference(UNIT_TYPE));
}
和在activity.java
最后一个共享preferences单位preference = preferenceManager.getDefaultShared preferences(本);
最后弦乐unitstring =单位preference.getString(UNIT_TYPE,);
但什么,在哪里,我应该写一些code,这样的改变是迅速完成?
全部更新code:
SettingsActivity.java
包com.basic.mileagecalculatorwithsettings;进口android.annotation.TargetApi;
进口android.content.Context;
进口android.content.Shared preferences;
进口android.content.Shared preferences.Editor;
进口android.content.res.Configuration;
进口android.media.Ringtone;
进口android.media.RingtoneManager;
进口android.net.Uri;
进口android.os.Build;
进口android.os.Bundle;
进口的Android preference.List preference。
。进口的Android preference preference;
。进口的Android preference preferenceActivity;
。进口的Android preference preferenceCategory;
。进口的Android preference preferenceFragment;
。进口的Android preference preferenceManager。
。进口的Android preference.Ringtone preference;
进口android.text.TextUtils;
进口android.util.Log;
进口android.view.MenuItem;
进口android.support.v4.app.NavUtils;
进口的java.util.List;公共类SettingsActivity扩展preferenceActivity
{私有静态最终布尔ALWAYS_SIMPLE_ preFS = FALSE;
受保护的静态最后弦乐TAG = NULL;@TargetApi(Build.VERSION_ codeS.HONEYCOMB)
@覆盖
保护无效的onCreate(捆绑savedInstanceState)
{
super.onCreate(savedInstanceState);
setupActionBar(); 如果(Build.VERSION.SDK_INT> = Build.VERSION_ codeS.HONEYCOMB){
//显示片断为主要内容。
getFragmentManager()调用BeginTransaction()
.replace(android.R.id.content,新的一般preferenceFragment())
。承诺();
}其他{
//正常使用preferences
setupSimple preferencesScreen(); $p$pferenceManager.getDefaultShared$p$pferences(this).registerOnShared$p$pferenceChangeListener(m$p$pfsListener);
}
}共享preferences.OnShared preferenceChangeListener米prefsListener =新的共享preferences.OnShared preferenceChangeListener(){
@覆盖
公共无效onShared preferenceChanged(最后一个共享preferences共享preferences,最终字符串键){
如果(UNIT_TYPE.equals(键)){
Log.v(TAG,设置已更改!);
}
}};
@TargetApi(Build.VERSION_ codeS.HONEYCOMB)
私人无效setupActionBar()
{
如果(Build.VERSION.SDK_INT> = Build.VERSION_ codeS.HONEYCOMB)
{
getActionBar()setDisplayHomeAsUpEnabled(真)。
}
}
@覆盖
公共布尔onOptionsItemSelected(菜单项项)
{
开关(item.getItemId())
{
案例android.R.id.home:
NavUtils.navigateUpFromSameTask(本);
返回true;
}
返回super.onOptionsItemSelected(项目);
}
@覆盖
保护无效onPostCreate(捆绑savedInstanceState)
{
super.onPostCreate(savedInstanceState); // setupSimple preferencesScreen();
}
私人无效setupSimple preferencesScreen(){
如果(!isSimple preferences(本)){
返回;
}
加preferencesFromResource(R.xml pref_general);}
@覆盖
公共布尔onIsMultiPane()
{
返回isXLargeTablet(本)及和放大器; !isSimple preferences(本);
}
私有静态布尔isXLargeTablet(上下文的背景下)
{
收益率(。context.getResources()getConfiguration()屏幕布置和放大器; Configuration.SCREENLAYOUT_SIZE_MASK)> = Configuration.SCREENLAYOUT_SIZE_XLARGE;
}
私有静态布尔isSimple preferences(上下文的背景下)
{
返回ALWAYS_SIMPLE_ preFS
|| Build.VERSION.SDK_INT< Build.VERSION_ codeS.HONEYCOMB
|| !isXLargeTablet(上下文);
}
@覆盖
@TargetApi(Build.VERSION_ codeS.HONEYCOMB)
公共无效onBuildHeaders(列表<页眉和GT;目标)
{
如果(!isSimple preferences(本))
{
//loadHeadersFromResource(R.xml.$p$pf_headers,目标);
}
};
私有静态preference.On preferenceChangeListener sBind preferenceSummaryToValueListener =新的preference.On preferenceChangeListener(){
@覆盖
在preferenceChange公共布尔(preference preference,对象的值)
{
串stringValue的= value.toString(); 如果(preference的instanceof名单preference)
{
列表preference列表preference =(列表preference)preference;
INT指数=列表preference.findIndexOfValue(stringValue的);
preference.setSummary(索引> = 0列表preference.getEntries()[指数]:NULL);
}
否则,如果(preference的instanceof铃声preference)
{
如果(TextUtils.isEmpty(stringValue的))
{
//$p$pference.setSummary(R.string.$p$pf_ringtone_silent);
}
其他
{
铃声铃声= RingtoneManager.getRingtone(
preference.getContext(),Uri.parse(stringValue的));
如果(铃声== NULL)
{preference.setSummary(NULL);}
其他
{
字符串名称= ringtone.getTitle(preference.getContext());
preference.setSummary(名);
}
}
}
其他
{
preference.setSummary(stringValue的);
}
返回true;
}
};
私有静态无效绑定preferenceSummaryToValue(preference preference)
{
preference.setOn preferenceChangeListener(sBind preferenceSummaryToValueListener);
sBind$p$pferenceSummaryToValueListener.on$p$pferenceChange($p$pference,$p$pferenceManager.getDefaultShared$p$pferences($p$pference.getContext()).getString($p$pference.getKey(),\"\"));
}
@TargetApi(Build.VERSION_ codeS.HONEYCOMB)
公共静态类普通preferenceFragment扩展preferenceFragment
{
@覆盖
公共无效的onCreate(捆绑savedInstanceState)
{
super.onCreate(savedInstanceState);
加preferencesFromResource(R.xml pref_general);
绑定preferenceSummaryToValue(找到preference(example_list));
绑定preferenceSummaryToValue(找到preference(fuel_type));
绑定preferenceSummaryToValue(找到preference(UNIT_TYPE)); }
@覆盖
公共无效onResume(){
super.onResume();
}
公共无效的onPause(捆绑savedInstanceState)
{
super.onPause();
加preferencesFromResource(R.xml pref_general); }
}
}
pref_general.xml
<名单preference
机器人:设置defaultValue =1
机器人:项=@阵列/ pref_example_list_titles
机器人:entryValues =@阵列/ pref_example_list_values
机器人:键=city_list
机器人:negativeButtonText =@空
机器人:positiveButtonText =@空
机器人:标题=@字符串/ pref_title_add_friends_to_messages机器人:启用=真/><名单preference
机器人:设置defaultValue =1
机器人:项=@阵列/ pref_fuel_type_titles
机器人:entryValues =@阵列/ pref_fuel_type_values
机器人:键=fuel_type
机器人:negativeButtonText =@空
机器人:positiveButtonText =@空
机器人:标题=@字符串/ pref_title_select_fuel机器人:启用=真/><名单preference
机器人:设置defaultValue =1
机器人:项=@阵列/ pref_units_titles
机器人:entryValues =@阵列/ pref_units_values
机器人:键=UNIT_TYPE
机器人:negativeButtonText =@空
机器人:positiveButtonText =@空
机器人:标题=@字符串/ pref_title_unit机器人:启用=真/>< / preferenceScreen>
我检查你的code,看上去就像你不能创建常规preferenceFragment
在所有。所以,如果我添加以下内容:
@覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
setupActionBar(); //显示片断为主要内容。
getFragmentManager()调用BeginTransaction()
.replace(android.R.id.content,新的一般preferenceFragment())
。承诺();
}
和删除 setupSimple preferencesScreen()
通话,那么它工作正常上最新的Android版本。
如果您需要支持旧版本,我会做下列方式:
公共类SettingsActivity扩展$ P $ {pferenceActivity 私有静态最终布尔ALWAYS_SIMPLE_ preFS = FALSE;
受保护的静态最后弦乐TAG = NULL; @TargetApi(Build.VERSION_ codeS.HONEYCOMB)
@覆盖
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
setupActionBar(); 如果(Build.VERSION.SDK_INT> = Build.VERSION_ codeS.HONEYCOMB){
//显示片断为主要内容。
getFragmentManager()调用BeginTransaction()
.replace(android.R.id.content,新的一般preferenceFragment())
。承诺();
}其他{
//正常使用preferences
setupSimple preferencesScreen(); $p$pferenceManager.getDefaultShared$p$pferences(this).registerOnShared$p$pferenceChangeListener(m$p$pfsListener);
}
} 共享preferences.OnShared preferenceChangeListener米prefsListener =新的共享preferences.OnShared preferenceChangeListener(){
@覆盖
公共无效onShared preferenceChanged(最后一个共享preferences共享preferences,最终字符串键){
Log.v(TAG,设置已更改!);
}
}; @TargetApi(Build.VERSION_ codeS.HONEYCOMB)
私人无效setupActionBar()
{
如果(Build.VERSION.SDK_INT> = Build.VERSION_ codeS.HONEYCOMB)
{
getActionBar()setDisplayHomeAsUpEnabled(真)。
}
}
@覆盖
公共布尔onOptionsItemSelected(菜单项项)
{
开关(item.getItemId())
{
案例android.R.id.home:
//NavUtils.navigateUpFromSameTask(this);
返回true;
}
返回super.onOptionsItemSelected(项目);
}
@覆盖
保护无效onPostCreate(捆绑savedInstanceState)
{
super.onPostCreate(savedInstanceState); // setupSimple preferencesScreen();
}
私人无效setupSimple preferencesScreen(){
如果(!isSimple preferences(本)){
返回;
}
加preferencesFromResource(R.xml pref_general);
} @覆盖
公共布尔onIsMultiPane(){
返回isXLargeTablet(本)及和放大器; !isSimple preferences(本);
} 私有静态布尔isXLargeTablet(上下文的背景下){
收益率(。context.getResources()getConfiguration()屏幕布置和放大器; Configuration.SCREENLAYOUT_SIZE_MASK)> = Configuration.SCREENLAYOUT_SIZE_XLARGE;
}
私有静态布尔isSimple preferences(上下文的背景下){
返回ALWAYS_SIMPLE_ preFS
|| Build.VERSION.SDK_INT< Build.VERSION_ codeS.HONEYCOMB
|| !isXLargeTablet(上下文);
} @覆盖
@TargetApi(Build.VERSION_ codeS.HONEYCOMB)
公共无效onBuildHeaders(列表<页眉和GT;目标){
如果(!isSimple preferences(本)){
//loadHeadersFromResource(R.xml.$p$pf_headers,目标);
}
} 私有静态preference.On preferenceChangeListener sBind preferenceSummaryToValueListener =新的preference.On preferenceChangeListener(){
@覆盖
在preferenceChange公共布尔(preference preference,对象的值){
Log.v(TAG,设置已更改!); 串stringValue的= value.toString(); 如果(preference的instanceof名单preference){
列表preference列表preference =(列表preference)preference;
INT指数=列表preference.findIndexOfValue(stringValue的);
preference.setSummary(索引> = 0列表preference.getEntries()[指数]:NULL);
}
否则,如果(preference的instanceof铃声preference){
如果(TextUtils.isEmpty(stringValue的)){
//$p$pference.setSummary(R.string.$p$pf_ringtone_silent);
}其他{
铃声铃声= RingtoneManager.getRingtone(
preference.getContext(),Uri.parse(stringValue的));
如果(铃声== NULL){
preference.setSummary(NULL);
}其他{
字符串名称= ringtone.getTitle(preference.getContext());
preference.setSummary(名);
}
}
}其他{
preference.setSummary(stringValue的);
} 返回true;
}
};
私有静态无效绑定preferenceSummaryToValue(preference preference){
preference.setOn preferenceChangeListener(sBind preferenceSummaryToValueListener);
sBind$p$pferenceSummaryToValueListener.on$p$pferenceChange($p$pference,$p$pferenceManager.getDefaultShared$p$pferences($p$pference.getContext()).getString($p$pference.getKey(),\"\"));
} @TargetApi(Build.VERSION_ codeS.HONEYCOMB)
公共静态类普通preferenceFragment扩展$ P $ {pferenceFragment
@覆盖
公共无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState);
加preferencesFromResource(R.xml pref_general);
绑定preferenceSummaryToValue(找到preference(example_list));
绑定preferenceSummaryToValue(找到preference(fuel_type));
绑定preferenceSummaryToValue(找到preference(UNIT_TYPE));
} @覆盖
公共无效onResume(){
super.onResume();
} 公共无效的onPause(捆绑savedInstanceState){
super.onPause();
加preferencesFromResource(R.xml pref_general);
}
}
}
我已经签了code具有以下pref_general.xml:
< preferenceScreen
的xmlns:机器人=http://schemas.android.com/apk/res/android> < preferenceCategory
机器人:标题=标题类别> <名单preference
机器人:键=example_list
机器人:标题=example_list
机器人:总结=example_list
机器人:项=@阵列/ entries_list_ preference
机器人:entryValues =@阵列/ entryvalues_list_ preference
机器人:DIALOGTITLE =example_list/>
<名单preference
机器人:键=fuel_type
机器人:标题=fuel_type
机器人:总结=fuel_type
机器人:项=@阵列/ entries_list_ preference
机器人:entryValues =@阵列/ entryvalues_list_ preference
机器人:DIALOGTITLE =fuel_type/>
<名单preference
机器人:键=UNIT_TYPE
机器人:标题=UNIT_TYPE
机器人:总结=UNIT_TYPE
机器人:项=@阵列/ entries_list_ preference
机器人:entryValues =@阵列/ entryvalues_list_ preference
机器人:DIALOGTITLE =UNIT_TYPE/>
< / preferenceCategory>< / preferenceScreen>
和能够观察到设置已经改变了!
日志。
基本上与您的code中的问题是,你没有创建常规preferenceFragment
有听众既没有使用 $共享p $ pferences.OnShared preferenceChangeListener
。我建议做code更具可读性,然后你发现的问题可能会更加容易。
What code is used to detect any changes made in SharedPreferences when the app is running? The changes made in my SharedPreferences are only reflected when the app is closed and started again. It does not gets changed during the same session.
To fetch the preferences I use the following code In SettingsActivity.java
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_general);
bindPreferenceSummaryToValue(findPreference("unit_type"));
}
and in activity.java
final SharedPreferences unitpreference = PreferenceManager.getDefaultSharedPreferences(this);
final String unitstring = unitpreference.getString("unit_type", "");
But what and where should I write some code so that the changes are made instantly?
Full Updated Code: SettingsActivity.java
package com.basic.mileagecalculatorwithsettings;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.content.res.Configuration;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.preference.RingtonePreference;
import android.text.TextUtils;
import android.util.Log;
import android.view.MenuItem;
import android.support.v4.app.NavUtils;
import java.util.List;
public class SettingsActivity extends PreferenceActivity
{
private static final boolean ALWAYS_SIMPLE_PREFS = false;
protected static final String TAG = null;
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setupActionBar();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// Display the fragment as the main content.
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new GeneralPreferenceFragment())
.commit();
} else {
// use normal preferences
setupSimplePreferencesScreen();
PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(mPrefsListener);
}
}
SharedPreferences.OnSharedPreferenceChangeListener mPrefsListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) {
if ("unit_type".equals(key)) {
Log.v(TAG, "Setting has been changed!");
}
}
};
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void setupActionBar()
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
{
getActionBar().setDisplayHomeAsUpEnabled(true);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onPostCreate(Bundle savedInstanceState)
{
super.onPostCreate(savedInstanceState);
//setupSimplePreferencesScreen();
}
private void setupSimplePreferencesScreen() {
if (!isSimplePreferences(this)) {
return;
}
addPreferencesFromResource(R.xml.pref_general);}
@Override
public boolean onIsMultiPane()
{
return isXLargeTablet(this) && !isSimplePreferences(this);
}
private static boolean isXLargeTablet(Context context)
{
return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE;
}
private static boolean isSimplePreferences(Context context)
{
return ALWAYS_SIMPLE_PREFS
|| Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB
|| !isXLargeTablet(context);
}
@Override
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void onBuildHeaders(List<Header> target)
{
if (!isSimplePreferences(this))
{
//loadHeadersFromResource(R.xml.pref_headers, target);
}
};
private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object value)
{
String stringValue = value.toString();
if (preference instanceof ListPreference)
{
ListPreference listPreference = (ListPreference) preference;
int index = listPreference.findIndexOfValue(stringValue);
preference.setSummary(index >= 0 ? listPreference.getEntries()[index]:null);
}
else if (preference instanceof RingtonePreference)
{
if (TextUtils.isEmpty(stringValue))
{
//preference.setSummary(R.string.pref_ringtone_silent);
}
else
{
Ringtone ringtone = RingtoneManager.getRingtone(
preference.getContext(), Uri.parse(stringValue));
if (ringtone == null)
{preference.setSummary(null);}
else
{
String name = ringtone.getTitle(preference.getContext());
preference.setSummary(name);
}
}
}
else
{
preference.setSummary(stringValue);
}
return true;
}
};
private static void bindPreferenceSummaryToValue(Preference preference)
{
preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);
sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,PreferenceManager.getDefaultSharedPreferences(preference.getContext()).getString(preference.getKey(),""));
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class GeneralPreferenceFragment extends PreferenceFragment
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_general);
bindPreferenceSummaryToValue(findPreference("example_list"));
bindPreferenceSummaryToValue(findPreference("fuel_type"));
bindPreferenceSummaryToValue(findPreference("unit_type"));
}
@Override
public void onResume() {
super.onResume();
}
public void onPause(Bundle savedInstanceState)
{
super.onPause();
addPreferencesFromResource(R.xml.pref_general);
}
}
}
pref_general.xml
<ListPreference
android:defaultValue="1"
android:entries="@array/pref_example_list_titles"
android:entryValues="@array/pref_example_list_values"
android:key="city_list"
android:negativeButtonText="@null"
android:positiveButtonText="@null"
android:title="@string/pref_title_add_friends_to_messages" android:enabled="true"/>
<ListPreference
android:defaultValue="1"
android:entries="@array/pref_fuel_type_titles"
android:entryValues="@array/pref_fuel_type_values"
android:key="fuel_type"
android:negativeButtonText="@null"
android:positiveButtonText="@null"
android:title="@string/pref_title_select_fuel" android:enabled="true"/>
<ListPreference
android:defaultValue="1"
android:entries="@array/pref_units_titles"
android:entryValues="@array/pref_units_values"
android:key="unit_type"
android:negativeButtonText="@null"
android:positiveButtonText="@null"
android:title="@string/pref_title_unit" android:enabled="true"/>
</PreferenceScreen>
I've checked Your code and looks like You're not creating GeneralPreferenceFragment
at all. So, if I add the following:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupActionBar();
// Display the fragment as the main content.
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new GeneralPreferenceFragment())
.commit();
}
And remove setupSimplePreferencesScreen()
call, then it works fine on latest Android versions.
If You need to support old versions, I would do it the following way:
public class SettingsActivity extends PreferenceActivity {
private static final boolean ALWAYS_SIMPLE_PREFS = false;
protected static final String TAG = null;
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupActionBar();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// Display the fragment as the main content.
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new GeneralPreferenceFragment())
.commit();
} else {
// use normal preferences
setupSimplePreferencesScreen();
PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(mPrefsListener);
}
}
SharedPreferences.OnSharedPreferenceChangeListener mPrefsListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, final String key) {
Log.v(TAG, "Setting has been changed!");
}
};
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void setupActionBar()
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
{
getActionBar().setDisplayHomeAsUpEnabled(true);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case android.R.id.home:
//NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onPostCreate(Bundle savedInstanceState)
{
super.onPostCreate(savedInstanceState);
//setupSimplePreferencesScreen();
}
private void setupSimplePreferencesScreen() {
if (!isSimplePreferences(this)) {
return;
}
addPreferencesFromResource(R.xml.pref_general);
}
@Override
public boolean onIsMultiPane() {
return isXLargeTablet(this) && !isSimplePreferences(this);
}
private static boolean isXLargeTablet(Context context) {
return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE;
}
private static boolean isSimplePreferences(Context context) {
return ALWAYS_SIMPLE_PREFS
|| Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB
|| !isXLargeTablet(context);
}
@Override
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void onBuildHeaders(List<Header> target) {
if (!isSimplePreferences(this)) {
//loadHeadersFromResource(R.xml.pref_headers, target);
}
}
private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object value) {
Log.v(TAG, "Setting has been changed!");
String stringValue = value.toString();
if (preference instanceof ListPreference) {
ListPreference listPreference = (ListPreference) preference;
int index = listPreference.findIndexOfValue(stringValue);
preference.setSummary(index >= 0 ? listPreference.getEntries()[index]:null);
}
else if (preference instanceof RingtonePreference) {
if (TextUtils.isEmpty(stringValue)) {
//preference.setSummary(R.string.pref_ringtone_silent);
} else {
Ringtone ringtone = RingtoneManager.getRingtone(
preference.getContext(), Uri.parse(stringValue));
if (ringtone == null) {
preference.setSummary(null);
} else {
String name = ringtone.getTitle(preference.getContext());
preference.setSummary(name);
}
}
} else {
preference.setSummary(stringValue);
}
return true;
}
};
private static void bindPreferenceSummaryToValue(Preference preference){
preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);
sBindPreferenceSummaryToValueListener.onPreferenceChange(preference,PreferenceManager.getDefaultSharedPreferences(preference.getContext()).getString(preference.getKey(),""));
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class GeneralPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_general);
bindPreferenceSummaryToValue(findPreference("example_list"));
bindPreferenceSummaryToValue(findPreference("fuel_type"));
bindPreferenceSummaryToValue(findPreference("unit_type"));
}
@Override
public void onResume() {
super.onResume();
}
public void onPause(Bundle savedInstanceState) {
super.onPause();
addPreferencesFromResource(R.xml.pref_general);
}
}
}
I've checked that code with the following pref_general.xml:
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="Title category">
<ListPreference
android:key="example_list"
android:title="example_list"
android:summary="example_list"
android:entries="@array/entries_list_preference"
android:entryValues="@array/entryvalues_list_preference"
android:dialogTitle="example_list" />
<ListPreference
android:key="fuel_type"
android:title="fuel_type"
android:summary="fuel_type"
android:entries="@array/entries_list_preference"
android:entryValues="@array/entryvalues_list_preference"
android:dialogTitle="fuel_type" />
<ListPreference
android:key="unit_type"
android:title="unit_type"
android:summary="unit_type"
android:entries="@array/entries_list_preference"
android:entryValues="@array/entryvalues_list_preference"
android:dialogTitle="unit_type" />
</PreferenceCategory>
</PreferenceScreen>
And was able to observe Setting has been changed!
logs.
Basically the issue with Your code was that You're neither create GeneralPreferenceFragment
which has listeners neither use SharedPreferences.OnSharedPreferenceChangeListener
. I would suggest to make code more readable, then it might be easier for You to spot issues.
这篇关于共享preferences不保存,无需重新启动应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!