我尝试在“设置”页面中使用SwitchPreference,但我无法让听众工作。我正在使用自定义小部件布局来设置切换样式,因为我找不到如何使用主题来实现这一点。在我的settings.xml中,我有以下内容:
<SwitchPreference
android:key="uitestmode"
android:summary="Enable to display test data in fragments"
android:title="UI Test Mode"
android:widgetLayout="@layout/widget_custom_switch_on_off" >
</SwitchPreference>
和我的SettingsFragment看起来像:
SwitchPreference uiTestModePref = (SwitchPreference) findPreference("uitestmode");
uiTestModePref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
Log.d(preference.getKey(), newValue.toString());
return false;
}
});
和我的交换机的自定义布局:
<?xml version="1.0" encoding="utf-8"?>
<Switch xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/custom_switch_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:textColor="@android:color/white"
android:textIsSelectable="false"
android:textSize="18sp"
android:textOn="On"
android:textOff="Off"
android:textStyle="bold"
android:thumb="@drawable/carcast_switch_inner_holo_dark"
android:track="@drawable/carcast_switch_track_holo_dark" />
我遇到的问题是,当我单击开关时,不会调用侦听器。有谁知道为什么以及如何解决它?
答案 0 :(得分:5)
我遇到了同样的问题,我的解决方案类似于以下内容:
在自定义开关布局中,添加以下代码。这个&#34;揭示&#34;首选项,并使整个块可单击。这就是听众根本没有被触发的原因。
机器人:可点击=&#34;假&#34; 机器人:可聚焦=&#34;假&#34;
扩展&#34; SwitchPreference&#34;,以及&#34; onBindView&#34; class,从SharedPreferences获取状态,并在那里处理开关状态。
public class MySwitchPreference extends SwitchPreference {
public MySwitchPreference(Context context) {
super(context, null);
}
public MySwitchPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MySwitchPreference(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
protected void onBindView(View view) {
// Clean listener before invoke SwitchPreference.onBindView
ViewGroup viewGroup= (ViewGroup)view;
clearListenerInViewGroup(viewGroup);
super.onBindView(view);
final Switch mySwitch = (Switch) view.findViewById(R.id.custom_switch_item);
Boolean initVal = this.getPersistedBoolean(false);
if (initVal) {
mySwitch.setChecked(true);
}
this.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
//Do your things here, toggling the switch and so on
return true;
}
});
}
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);
}
}
}
}
希望这可以帮到你。在我用这种方式解决之前,我无法为我的案例找到任何解决方案。
答案 1 :(得分:0)
答案 2 :(得分:0)
SwitchView的ID应该为@android:id/switch_widget
,而不是@+id/custom_switch_item
或任何其他自定义ID。
在SwitchPreference
类的源代码中,我们可以找到以下代码:
View switchView = view.findViewById(AndroidResources.ANDROID_R_SWITCH_WIDGET);
和AndroidResources
中的
static final int ANDROID_R_SWITCH_WIDGET = android.R.id.switch_widget;
因此只能正确找到id = @android:id/switch_widget
。
这是有关SwitchPreference的widgetLayout的演示:
<Switch xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/switch_widget"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical" />