共享preferences不保存,无需重新启动应用程序 [英] SharedPreferences not saving without restarting app

查看:231
本文介绍了共享preferences不保存,无需重新启动应用程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

什么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.mileagec​​alculatorwithsettings;进口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;
进口的Andr​​oid preference.List preference。
。进口的Andr​​oid preference preference;
。进口的Andr​​oid preference preferenceActivity;
。进口的Andr​​oid preference preferenceCategory;
。进口的Andr​​oid preference preferenceFragment;
。进口的Andr​​oid preference preferenceManager。
。进口的Andr​​oid 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()通话,那么它工作正常上最新的Andr​​oid版本。

如果您需要支持旧版本,我会做下列方式:

 公共类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:机器人=htt​​p://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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆