Nel*_*tin 2 android preferencefragment android-switch
我正在尝试在"设置"页面中使用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>
Run Code Online (Sandbox Code Playgroud)
我的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;
}
});
Run Code Online (Sandbox Code Playgroud)
和我的交换机的自定义布局:
<?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" />
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当我单击开关时,不会调用侦听器.有谁知道为什么以及如何解决它?
小智 5
我遇到了同样的问题,我的解决方案类似于以下内容:
在自定义开关布局中,添加以下代码.这"揭示"了偏好,并使整个块可以点击.这就是听众根本没有被触发的原因.
android:clickable ="false"android:focusable ="false"
扩展"SwitchPreference",在"onBindView"类中,从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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)希望这可以帮助你.在我用这种方式解决之前,我无法为我的案例找到任何解决方案.