我搜索stackoverflow并找到下一个相关主题:
我还在Google群组中找到了bug报告:Issue 36636: Unable to override style switchStyle 最后用Switch小部件找到新的问题:
我尝试创建自己的 Preference.SwitchPreference 并使用Switch小部件定义布局
android:id="@+android:id/switchWidget"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:thumb="@drawable/switch_thumb"
android:layout_gravity="center"
android:padding="16dip"
android:focusable="false" />
但是我收到了一个compliation错误:错误:资源不公开。 ('id'的值为' @ + android:id / switchWidget ')。所以我不能用这种方式。
那么,如何获得SDK API 15的自定义切换首选项???或者我如何自定义切换首选项?
答案 0 :(得分:3)
刚刚找到了实现这一目标的糟糕方法。
首先, src / com / myapp / views / preference / MySwitchPreference.java
public class MySwitchPreference extends SwitchPreference {
public MySwitchPreference(Context context) {
super(context);
}
public MySwitchPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MySwitchPreference(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onBindView(View view) {
super.onBindView(view);
if (view instanceof ViewGroup) {
setLayout((ViewGroup) view);
}
}
@SuppressLint("NewApi")
private void setLayout(ViewGroup viewGroup) {
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;
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
switchView.setThumbResource(com.myapp.R.drawable.switch_inner);
switchView.setTrackResource(com.myapp.R.drawable.switch_track);
}
return;
}
else if (childView instanceof ViewGroup)
setLayout((ViewGroup) childView);
}
}
}
现在, res / xml / preferences.xml
<com.myapp.views.preference.MySwitchPreference
android:switchTextOff="Off"
android:switchTextOn="On"
android:title="whatever"
android:key="switch" />
有点棘手,只能使用Android&gt; 16。
答案 1 :(得分:1)
对切换问题不太了解,但您可以使用ToggleButton
,如下所示:
在布局中定义按钮:
<ToggleButton
android:id="@+id/your_awesome_toggle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:gravity="center_vertical|center_horizontal"
android:layout_marginRight="15dp"
android:textOn=""
android:textOff=""
android:background="@drawable/toggle_button"
/>
创建一个选择器:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:state_checked="false"
android:state_focused="false"
android:drawable="@drawable/switch_off_btn" />
<item
android:state_checked="true"
android:state_focused="false"
android:drawable="@drawable/switch_on_btn" />
<item
android:drawable="@drawable/switch_off_btn" />
</selector>
OnClickListener
:
toggleOnOff = (ToggleButton) findViewById(R.id.your_awesome_toggle);
toggleOnOff.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
updateButtons();
if(toggleOnOff.isChecked()){
SharedPreferences emailPrefs = getSharedPreferences(rememberToggleOnOff,MODE_PRIVATE);
SharedPreferences.Editor editor = yourPrefs.edit();
editor.putBoolean("mon", true);
editor.commit();
}
else {
SharedPreferences emailPrefs = getSharedPreferences(rememberToggleOnOff,MODE_PRIVATE);
SharedPreferences.Editor editor = yourPrefs.edit();
editor.putBoolean("mon", false);
editor.commit();
}
}
});
checkToggleState();
checkToggleState
方法:
/**
* Checks the state of the Toggle button preferences.
* If preferences are true set the toggle to on, if false set the toggle off.
*
*/
private void checkToggleState() {
SharedPreferences yourPrefs = getSharedPreferences(rememberToggleOnOff,MODE_PRIVATE);
boolean mON = yourPrefs.getBoolean("mon", true);
if(mON) {
toggleOnOff.setChecked(true);
}
else {
toggleOnOff.setChecked(false);
}
}
答案 2 :(得分:0)
变化:
android:id="@+android:id/switchWidget"
要:
android:id="@+id/switchWidget"
可以找到一个简单的切换示例here。
Switch小部件仅支持14级及以上API级别,但如果您想使用Switch Preference pre API级别14,请选中this。
更新:如果您想为自己的开关设置样式,请尝试this
答案 3 :(得分:0)
继承SwitchPreference类并在preferences.xml中使用它,其布局指向您的自定义布局。然后在继承的SwitchPreference类的onBind方法中,您可以通过id和set listeners找到相应的视图。不要忘记在onBind()中调用super。
答案 4 :(得分:-2)
变化:
android:id="@+android:id/switchWidget"
要:
android:id="@*android:id/switchWidget"