5

次のプロパティでMultiSelectListPreferenceを使用しています。

<MultiSelectListPreference        
 android:key="shop_list"               
 android:entries="@array/shop_titles"
 android:entryValues="@array/shop_values"
     android:title="@string/pref_title_shops"   
     android:dialogTitle="@string/pref_title_shops" 
 android:defaultValue="@array/shop_values"
 android:summary="Choose where you hunt"
 />   

設定は staticPreferenceFragment内、 common 内にありActivityます。とのSharedPreferenceChangedイベントのリスナーを登録および登録解除しています。onPauseonResumePreferenceFragment

コードの抜粋:

public class AgentSettingsActivity extends Activity
{

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        getFragmentManager().beginTransaction().replace(android.R.id.content, new SettingsFragment()).commit();
    }

    public static class SettingsFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener
    {
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            Utils.Log("onCreate");

            // Load the preferences from an XML resource
            addPreferencesFromResource(R.xml.pref_general);

        }

        @Override
        public void onResume()
        {
            Utils.Log("onResume");
                    super.onResume();
            try
            {
                Utils.Log("Add pref listeners and try set summary");
               getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);

            }
            catch (Exception e)
            {
                Utils.Log("Pref not found");
            }

        }

        @Override
        public void onPause()
        {
            super.onPause();
            Utils.Log("onPause");

            // Unregister the listener whenever a key changes
            getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);

        }

        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
        {
            Utils.Log("onPreferenceChange, key : " + key);    
        }
    }

}

オプションをチェックすると、チェックを外し始めるまで毎回イベントが発生します。その後、リスナーが呼び出されなくなります。私がここで見逃しているアイデアはありますか? これは、フラグメント/アクティビティの使用方法に問題がありますか?

注: また、MultiSelectListPref が適切に応答しなくなった後も引き続き機能する ListPreference があることも付け加えておく必要があります。

4

2 に答える 2

2

私は同じ問題を扱っています。SDK 18 からはすべて正常に動作しているように見えますが、残りの部分では、私はあなたと同じ問題を抱えています。

私にとってはうまくいくと思われる解決策を見つけました:

    MultiSelectListPreference multiSelectListPref = (MultiSelectListPreference) findPreference("pref_name");
    if (multiSelectListPref != null) {
        multiSelectListPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                MultiSelectListPreference mpreference = (MultiSelectListPreference) preference;
                mpreference.setSummary(newValue.toString());
                mpreference.setValues((Set<String>) newValue);
                return true;
            }
        });
    }

あなたのケースにも役立つかもしれません

于 2014-04-01T12:16:19.227 に答える
1

SDK レベル 18 以降、期待どおりに動作するようになりました。どうやら、これはこのバージョンより前の SDK のバグでした (またはバグでした)。注目に値します。

于 2013-12-13T11:27:34.093 に答える