任何想法为什么在PreferenceScreen中有多个SwitchPreferences会产生一个问题,如果你选择任何一个框,它会导致其他框改变?在运行4.2.2的Nexus 4上进行测试但在运行4.0.4的Galaxy S3上进行测试时会出现此问题。感谢您提供的任何帮助。
<?xml version="1.0" encoding="utf-8"?>
<PreferenceCategory android:title="@string/description_photo_preference">
<SwitchPreference
android:key="use_gallery"
android:title="@string/title_use_gallery_preference"
android:summaryOff="@string/summary_dont_use_gallery_as_photo_source"
android:summaryOn="@string/summary_use_gallery_as_photo_source"
android:defaultValue="true"
/>
<SwitchPreference
android:key="use_camera"
android:title="@string/title_use_camera_preference"
android:summaryOff="@string/summary_dont_use_camera_as_photo_source"
android:summaryOn="@string/summary_use_camera_as_photo_source"
android:defaultValue="true"
/>
<SwitchPreference
android:key="show_last_vin"
android:title="@string/pref_string"
android:summaryOff="@string/pref_display__false"
android:summaryOn="@string/pref_display_true"
android:defaultValue="true"
/>
</PreferenceCategory>
<PreferenceCategory android:title="@string/description_photo_quality_settings">
<ListPreference
android:key="prefPhotoQuality"
android:entries="@array/photo_quality_settings"
android:summary="@string/pref_user_photo_quality_settings"
android:entryValues="@array/photo_quality_settings_values"
android:title="@string/description_photo_quality_settings" />
</PreferenceCategory>
答案 0 :(得分:3)
这似乎是this SO post报告的已知问题。
有一种解决方法,可以找到here。
以下是解决方法代码:
public class CustomSwitchPreference extends SwitchPreference {
/**
* Construct a new SwitchPreference with the given style options.
*
* @param context The Context that will style this preference
* @param attrs Style attributes that differ from the default
* @param defStyle Theme attribute defining the default style options
*/
public CustomSwitchPreference(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
/**
* Construct a new SwitchPreference with the given style options.
*
* @param context The Context that will style this preference
* @param attrs Style attributes that differ from the default
*/
public CustomSwitchPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* Construct a new SwitchPreference with default style options.
*
* @param context The Context that will style this preference
*/
public CustomSwitchPreference(Context context) {
super(context, null);
}
@Override
protected void onBindView(View view) {
// Clean listener before invoke SwitchPreference.onBindView
ViewGroup viewGroup= (ViewGroup)view;
clearListenerInViewGroup(viewGroup);
super.onBindView(view);
}
/**
* Clear listener in Switch for specify ViewGroup.
*
* @param viewGroup The ViewGroup that will need to clear the listener.
*/
private void clearListenerInViewGroup(ViewGroup viewGroup) {
if (null == viewGroup) {
return;
}
int count = viewGroup.getChildCount();
for(int n = 0; n < count; ++n) {
View childView = viewGroup.getChildAt(n);
if(childView instanceof Switch) {
final Switch switchView = (Switch) childView;
switchView.setOnCheckedChangeListener(null);
return;
} else if (childView instanceof ViewGroup){
ViewGroup childGroup = (ViewGroup)childView;
clearListenerInViewGroup(childGroup);
}
}
}
}