以编程方式更改开关的颜色

金丹·索尼

我试图创建一个简单的“自定义开关小部件”,以监听SharedPreferences中某个键的值的变化。下面是我的代码:

public class CustomSwitch extends SwitchCompat implements SharedPreferences.OnSharedPreferenceChangeListener {

    private static final String TAG = CustomSwitch.class.getSimpleName();

    private boolean isSwitchTintColorPrimary;

    public CustomSwitch(Context context) {
        this(context, null);
    }

    public CustomSwitch(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CustomSwitch(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initializeView(context, attrs);
    }

    private void initializeView(Context context, AttributeSet attrs) {
        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomSwitch, 0, 0);
        try {
            isSwitchTintColorPrimary = ta.getBoolean(R.styleable.CustomSwitch_tintColorPrimary, false);
        } finally {
            ta.recycle();
        }
        applyTheme();
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        registerThemeChangeListener();
    }

    private void registerThemeChangeListener() {
        if (getContext() != null)
            ColoriyoPreference.getSharedPreferences(getContext()).registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        unRegisterThemeChangeListener();
    }

    private void unRegisterThemeChangeListener() {
        if (getContext() != null)
            ColoriyoPreference.getSharedPreferences(getContext()).unregisterOnSharedPreferenceChangeListener(this);
    }

    private void applyTheme() {
        ColorStateList thumbStates = new ColorStateList(
                new int[][]{
                        {android.R.attr.state_checked, android.R.attr.state_enabled},
                        {-android.R.attr.state_checked, android.R.attr.state_enabled},
                        {}
                },
                new int[]{
                        isSwitchTintColorPrimary ? ColoriyoPreference.getColor(getContext()) : ContextCompat.getColor(getContext(), R.color.colorPrimary),
                        ContextCompat.getColor(getContext(), R.color.grey_50),
                        ContextCompat.getColor(getContext(), R.color.grey_50)
                }
        );
        setThumbTintList(thumbStates);

        ColorStateList trackStates = new ColorStateList(
                new int[][]{
                        new int[]{-android.R.attr.state_enabled},
                        new int[]{}
                },
                new int[]{
                        Color.GRAY,
                        Color.LTGRAY
                }
        );
        setTrackTintList(trackStates);
        setTrackTintMode(PorterDuff.Mode.OVERLAY);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        if (key.equals(PREFERENCE_KEY_COLOR)) {
            applyTheme();
        }
    }
}

并在布局中:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.chintansoni.android.themedemo.MainActivity"
    tools:showIn="@layout/activity_main">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <com.chintansoni.android.themedemo.customview.themeview.CustomTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView textColor"
            app:textColorPrimary="true" />

        <com.chintansoni.android.themedemo.customview.themeview.CustomButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button Background"
            app:backgroundColorPrimary="true" />

        <com.chintansoni.android.themedemo.customview.themeview.CustomSwitch
            android:id="@+id/switch_main"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textOff="Off"
            android:textOn="On"
            app:tintColorPrimary="true" />
    </LinearLayout>

    <uz.shift.colorpicker.LineColorPicker
        android:id="@+id/picker"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:layout_margin="16dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:orientation="horizontal" />

</android.support.constraint.ConstraintLayout>

但是我的观点没有在UI中呈现。另外,我想知道这段代码是否会优先听颜色变化并在运行时反映颜色变化?

有什么建议吗?

金丹·索尼

我唯一缺少的是:

public CustomSwitch(Context context, AttributeSet attrs) {
    this(context, attrs, R.attr.switchStyle); // <--- passing default Style Attribute 
}

我改进的课程如下:

public class CustomSwitch extends SwitchCompat implements SharedPreferences.OnSharedPreferenceChangeListener {

    private boolean isSwitchTintColorPrimary;

    public CustomSwitch(Context context) {
        this(context, null);
    }

    public CustomSwitch(Context context, AttributeSet attrs) {
        this(context, attrs, R.attr.switchStyle);
    }

    public CustomSwitch(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initializeView(context, attrs);
    }

    private void initializeView(Context context, AttributeSet attrs) {
        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomSwitch, 0, 0);
        try {
            isSwitchTintColorPrimary = ta.getBoolean(R.styleable.CustomSwitch_tintColorPrimary, false);
        } finally {
            ta.recycle();
        }
        applyTheme();
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        registerThemeChangeListener();
    }

    private void registerThemeChangeListener() {
        if (getContext() != null)
            ColoriyoPreference.getSharedPreferences(getContext()).registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        unRegisterThemeChangeListener();
    }

    private void unRegisterThemeChangeListener() {
        if (getContext() != null)
            ColoriyoPreference.getSharedPreferences(getContext()).unregisterOnSharedPreferenceChangeListener(this);
    }

    private void applyTheme() {
        ColorStateList thumbStates = new ColorStateList(
                new int[][]{
                        {android.R.attr.state_checked, android.R.attr.state_enabled},
                        {-android.R.attr.state_checked, android.R.attr.state_enabled},
                        {}
                },
                new int[]{
                        isSwitchTintColorPrimary ? ColoriyoPreference.getColor(getContext()) : ContextCompat.getColor(getContext(), R.color.colorPrimary),
                        ContextCompat.getColor(getContext(), R.color.grey_50),
                        ContextCompat.getColor(getContext(), R.color.grey_50)
                }
        );
        setThumbTintList(thumbStates);

        ColorStateList trackStates = new ColorStateList(
                new int[][]{
                        new int[]{android.R.attr.state_enabled},
                        new int[]{-android.R.attr.state_enabled}
                },
                new int[]{
                        Color.LTGRAY,
                        Color.GRAY,
                        Color.LTGRAY
                }
        );
        setTrackTintList(trackStates);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        if (key.equals(ColoriyoPreference.PREFERENCE_KEY_COLOR)) {
            applyTheme();
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章