如何为Android中的SwitchPreference
小部件设置可绘制的自定义样式或其他背景选择器?
(注意:不是常规的Switch
小部件,我的意思是SwitchPreference
/ PreferenceActivity
中使用的标准PreferenceFragment
小部件
答案 0 :(得分:15)
您必须为交换机本身创建自定义布局,并且可以像动态一样动态应用它。
preference.setWidgetLayoutResource(R.layout.custom_switch);
但我会详细介绍如何实现这一目标。
因此,您可以在xml文件中定义首选项,例如 preferences.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory android:title="YOUR_CATEGORY_TITLE" >
<SwitchPreference
android:key="SWITCH"
android:title="YOUR_TITLE_FOR_SWITCH" />
</PreferenceCategory>
</PreferenceScreen>
然后在PreferenceActivty类的onCreate()方法中读取它:
SwitchPreference pref = (SwitchPreference) findPreference(getString(R.string.SWITCH));
//pref.setChecked(true); // You can check it already if needed to true or false or a value you have stored persistently
pref.setWidgetLayoutResource(R.layout.custom_switch); // THIS IS THE KEY OF ALL THIS. HERE YOU SET A CUSTOM LAYOUT FOR THE WIDGET
pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
// Here you can enable/disable whatever you need to
return true;
}
});
custom_switch 布局如下所示:
<?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:textStyle="bold"
android:track="@drawable/switch_track"
android:thumb="@drawable/switch_thumb"/>
对于切换,您将有2个选择器用于 轨道 和 拇指 属性。 这些选择器的drawable可以使用由tasomaniac建议的Android Holo Color Generator生成。在这种情况下,您所要做的就是复制生成的可绘制文件夹的内容(仅适用于drawable-hdpi,drawable-mdpi,drawable-xhdpi,drawable-xxhdpi)。但您可以为所需的每个州创建自定义视图。
以下是这些选择器的外观: 的 switch_track:强>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/switch_bg_focused" android:state_focused="true"/>
<item android:drawable="@drawable/switch_bg"/>
</selector>
<强> switch_thumb:强>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/switch_thumb_disabled" android:state_enabled="false"/>
<item android:drawable="@drawable/switch_thumb_pressed" android:state_pressed="true"/>
<item android:drawable="@drawable/switch_thumb_activated" android:state_checked="true"/>
<item android:drawable="@drawable/switch_thumb"/>
</selector>
这就是它。这个解决方案帮助了我。如果我省略了什么,请告诉我,我会纠正这些问题。
答案 1 :(得分:4)
您可以使用以下网站为您的Switch生成样式。 http://android-holo-colors.com/
然后您可以使用以下库来定制实现常规Switch。这些库还包括SwitchPreference替代方案。
答案 2 :(得分:1)
这样做的一种方法是对SwitchPreference进行子类化并覆盖onBindView方法。在这样做时,您仍然希望在该方法中调用super.onBindView(view),但随后在子视图中找到Switch并根据需要设置样式:
package com.example;
import android.annotation.SuppressLint;
import android.content.Context;
import android.preference.SwitchPreference;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Switch;
import com.example.R;
public class CustomSwitchPreference extends SwitchPreference {
@SuppressLint("NewApi")
public CustomSwitchPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public CustomSwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public CustomSwitchPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomSwitchPreference(Context context) {
super(context);
}
@Override
protected void onBindView(View view) {
super.onBindView(view);
Switch theSwitch = findSwitchInChildviews((ViewGroup) view);
if (theSwitch!=null) {
//do styling here
theSwitch.setThumbResource(R.drawable.new_thumb_resource);
}
}
private Switch findSwitchInChildviews(ViewGroup view) {
for (int i=0;i<view.getChildCount();i++) {
View thisChildview = view.getChildAt(i);
if (thisChildview instanceof Switch) {
return (Switch)thisChildview;
}
else if (thisChildview instanceof ViewGroup) {
Switch theSwitch = findSwitchInChildviews((ViewGroup) thisChildview);
if (theSwitch!=null) return theSwitch;
}
}
return null;
}
}
答案 3 :(得分:0)
在您的 style.xml 文件中创建一个样式,并为其指定 Widget.AppCompat.CompoundButton.Switch 父项。
<style name="theme_switch_compat" parent="Widget.AppCompat.CompoundButton.Switch">
<item name="colorAccent">@color/YourColorAccent</item>
</style>
然后你可以使用下面的链接来完成你的主题