0

MultiSelectListPreference が変更されたときに onSharedPreferenceChanged が初めて呼び出されるという問題があります。設定アクティビティを開き、正常に機能する値を変更すると、onSharedPreferenceChanged が呼び出されます。ダイアログを再度開くと、選択された正しいエントリが表示されます。別のエントリを選択し、[OK] をクリックします。onSharedPreferenceChanged が呼び出されるようになりましたが、呼び出されません。ダイアログを再度開くと、エントリが選択されていません。私は何かを見逃していますか、それとも間違ったことをしましたか?

ここに私のpreferences.xmlがあります

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <MultiSelectListPreference
        android:key="operations"
        android:title="@string/pref_operations"
        android:dialogTitle="@string/pref_operations"
        android:entries="@array/pref_operations_entries"
        android:entryValues="@array/pref_operations_values"
        android:defaultValue="@array/pref_operations_default" />
</PreferenceScreen>

そして私の設定の断片

public class SettingsFragment extends PreferenceFragment 
          implements SharedPreferences.OnSharedPreferenceChangeListener
{    
    public static final String KEY_OPERATIONS_PREFERENCE = "operations";

    private MultiSelectListPreference operationsPreference;

    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);

        operationsPreference = (MultiSelectListPreference) getPreferenceScreen().findPreference(KEY_OPERATIONS_PREFERENCE);        
    }

    @Override
    public void onResume()
    {
        super.onResume();

        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());

        Set<String> operations = operationsPreference.getValues();
        String summary = "";
        for (String s : operations)
            summary += s + " ";
        operationsPreference.setSummary(summary);

       sharedPreferences.registerOnSharedPreferenceChangeListener(this);
   }

   @Override
   public void onPause()
   {
       super.onPause();

       getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
   }

   @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
    {
        if (key.equals(KEY_OPERATIONS_PREFERENCE))
        {            
            Set<String> operations = operationsPreference.getValues();
            String summary = "";
            for (String s : operations)
                summary += s + " ";
            operationsPreference.setSummary(summary);
        }        
    }
}
4

2 に答える 2

0

うーん、率直に言って、私は自分の sharedPreferances を別の方法で構築しました...私のコード例を添付してください。

これは sharedpreferences クラスです

public class AppPreferences {
        public static final String KEY_LANG = "language";
        final String APP_SHARED_PREFS = AppPreferences.class.getSimpleName(); // Name
                                                                                // of
                                                                                // the
                                                                                // file
                                                                                // -.xml
        private SharedPreferences _sharedPrefs;
        private Editor _prefsEditor;

        public AppPreferences(Context context) {
            this._sharedPrefs = context.getSharedPreferences(APP_SHARED_PREFS,
                    Activity.MODE_PRIVATE);
            this._prefsEditor = _sharedPrefs.edit();
        }

        public String getlanguage() {
            return _sharedPrefs.getString(KEY_LANG, "");
        }

        public void savelanguage(String text) {
            _prefsEditor.putString(KEY_LANG, text);
            _prefsEditor.commit();
        }
    }

それを使用するには、クラスで作成する必要があります

private AppPreferences _appPrefs;

使用例は

    _appPrefs = new AppPreferences(getApplicationContext());
            _appPrefs.savelanguage("English");
language = _appPrefs.getlanguage();

これが私がそれを構築した方法です...魅力のように機能します...そしてまったく複雑ではありません

于 2013-09-29T17:25:17.737 に答える