我正在使用 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"
/>
首选项位于静态 PreferenceFragment
中,位于普通 Activity
中。我正在为 PreferenceFragment
的 onPause
和 onResume
上的 SharedPreferenceChanged
事件注册和注销监听器。
代码摘录:
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);
}
}
}
当我选中一个选项时,事件每次都会触发直到我开始取消选中它们。然后监听器停止被调用。我在这里缺少什么想法?这与我使用 Fragment/Activity 的方式有关系吗?
注意:我还应该补充一点,我有一个 ListPreference,即使在 MultiSelectListPref 停止正确响应后,它仍会继续工作。
最佳答案
我正在处理同样的问题。 从 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;
}
});
}
也许它对你的案例也有用
关于Android MultiSelectListPreference 取消选中不会触发 SharedPreferenceChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15077568/