3

我搜索 stackoverflow 并找到下一个相关主题:

  1. 我如何为 Android Switch 设置样式?
  2. Android 4 中的自定义开关小部件
  3. 设置 switchStyle - 找不到错误资源 - 为什么?

我还在 google 组上找到错误报告:问题 36636:无法覆盖样式 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" />
    

但我收到一个编译错误:错误:资源不公开。(在“id”处,值为“ @+android:id/switchWidget ”)。所以我不能用这种方式。

  • 我尝试扩展 Switch 类的第二种方法是从代码中添加集合资源。但我发现setThumbResource方法只能从 API 16 获得。但我仍然无法应用@+android:id/switchWidget因为它不是公开的。

那么,如何获得 SDK API 15 的自定义 Switch Preference ???或者如何在偏好设置中自定义切换?

4

5 回答 5

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 > 16。

于 2014-05-10T18:58:55.300 回答
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);
        }
    }
于 2013-06-23T18:59:42.590 回答
0

继承 SwitchPreference 类并在preferences.xml 中使用它,布局指向您的自定义布局。然后在继承的 SwitchPreference 类的 onBind 方法中可以通过 id 找到对应的视图并设置监听器。不要忘记在 onBind() 中调用 super。

于 2013-09-19T05:02:00.890 回答
0

改变:

android:id="@+android:id/switchWidget"

至:

android:id="@+id/switchWidget"

可以在此处找到一个简单的开关示例。

Switch 小部件仅支持 14 及以上的 API 级别,但如果您想使用 API 级别 14 之前的 Switch Preference,请选中

更新:如果你想设计自己的开关,试试这个

于 2013-06-19T23:31:13.687 回答
-3

改变:

android:id="@+android:id/switchWidget"

至:

android:id="@*android:id/switchWidget"
于 2014-09-02T06:21:35.790 回答