2013-07-04 78 views
1

什麼代碼用於檢測應用程序運行時在SharedPreferences中所做的任何更改? 我的SharedPreferences中所做的更改僅在應用程序關閉並重新啓動時纔會反映出來。它在同一會話期間不會改變。SharedPreferences在不重新啓動應用程序時不保存

要取我使用下面的代碼 在SettingsActivity.java

@Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.pref_general); 
     bindPreferenceSummaryToValue(findPreference("unit_type")); 
    } 

的喜好和activity.java

final SharedPreferences unitpreference = PreferenceManager.getDefaultSharedPreferences(this); 
final String unitstring = unitpreference.getString("unit_type", ""); 

但什麼,在哪裏,我應該寫一些代碼,以便改變是立即做出來的?

完全更新的代碼: 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> 
+0

您必須提交您的共享首選項 – user1283633

+0

我應該在哪裏鍵入?我無法讓它工作。 您可以請看看我的代碼在這裏, http://pastebin.com/QBCQw2sV –

+0

您嘗試設置SharedPreferences.OnSharedPreferenceChangeListener:http://developer.android.com/reference/android/content/SharedPreferences.OnSharedPreferenceChangeListener。 html – sandrstar

回答

1

我檢查你的代碼,看起來像你沒有創造GeneralPreferenceFragment可言。所以,如果我添加以下內容:

@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(); 
} 

,並刪除setupSimplePreferencesScreen()呼叫,然後正常工作在最新的Android版本。

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

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); 
     } 
    } 
} 

我檢查有以下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> 

,並能夠觀察Setting has been changed!日誌。

基本上與您的代碼問題是,您既不創建GeneralPreferenceFragment其中聽衆既不使用SharedPreferences.OnSharedPreferenceChangeListener。我建議讓代碼更具可讀性,那麼您可能更容易發現問題。

+0

我稍微糾正了它。我試過了(用粘貼的代碼),它工作的很好,在聽衆的制動點被觸發。發帖前請嘗試。此外,請在問題中提供您的代碼而不是pastebin。 – sandrstar

+0

不,但我將不勝感激,如果您可以用您剛纔嘗試的代碼更新您的問題。所以我可以檢查它。 – sandrstar

+1

代碼更新..! –

0

如果在關閉應用程序之前沒有保存SharedPreferences,則可能未提交/應用更改(正如user1283633在他/她的評論中所暗示的那樣)。

根據JavaDoc爲SharedPrecerences.Editor

接口用於在SharedPreferences對象修改值。所有 更改都在編輯器中是成批的,直到你調用commit()或應用()

我想將數據添加到您的SharedPreferences商店當您使用SharedPreferences.Editor不復制回 原來SharedPreferences,並且在完成添加數據之後,您可以嘗試在Editor上撥打commit()apply()。如果您關心結果(返回布爾值),請選擇commit(),否則您可以使用apply()(void)。

相關問題