Android - 如何动态更改 SwitchPreference 开关的拇指/轨道颜色

Posted

技术标签:

【中文标题】Android - 如何动态更改 SwitchPreference 开关的拇指/轨道颜色【英文标题】:Android - How to dynamically change the thumb/track color of a SwitchPreference's switch 【发布时间】:2018-02-07 18:17:16 【问题描述】:

到目前为止,我只能在文本上使用setSpan() 更改首选项的摘要/标题文本颜色,但我找不到任何可以在SwitchPreference 中更改 Switch 颜色的东西,我考虑了几个计划包括设置自定义布局,或为首选项设置自定义适配器,但我还不清楚如何实现它们,因此,非常感谢您的帮助。

PS:我考虑过简单地设置一个自定义布局,但这在我的情况下不起作用,因为我需要在应用程序运行时更改 SwitchPreference 的颜色,并且用户可以为开关设置自定义颜色,因此主题在这种情况下也不起作用。

【问题讨论】:

参考这个***.com/questions/21235829/… Gautam,我已经尝试过自定义开关偏好,问题是我不知道如何在我的 Java 代码中设置开关的拇指/轨道的颜色。 【参考方案1】:

好的,我自己找到了解决办法:

创建一个自定义 SwitchPreference 类,然后将其应用于您获得的所有 SwitchPreference 小部件,该类如下所示:

    class ColorSwitchPreference extends SwitchPreference 
    Switch aSwitch;
    SharedPreferences sharedPreferences;

    public ColorSwitchPreference(Context context)
        super(context);
    

    public ColorSwitchPreference(Context context, AttributeSet attrs) 
        super(context, attrs);
    

    public ColorSwitchPreference(Context context, AttributeSet attrs, int defStyleAttr) 
        super(context, attrs, defStyleAttr);
    

    public ColorSwitchPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) 
        super(context, attrs, defStyleAttr, defStyleRes);
    


    @Override
    protected void onBindView(View view) 
        super.onBindView(view);
        aSwitch = findSwitchInChildViews((ViewGroup) view);
        if (aSwitch!=null) 
            //do change color here
            changeColor(aSwitch.isChecked(),aSwitch.isEnabled());
            aSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() 
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
                    changeColor(isChecked, aSwitch.isEnabled());
                
            );
        
    

    private void changeColor(boolean checked, boolean enabled)
        try 
            sharedPreferences = getContext().getSharedPreferences("settings_data",MODE_PRIVATE);
            //apply the colors here
            int thumbCheckedColor = sharedPreferences.getInt("theme_color_key",Color.parseColor("#3F51B5"));
            int thumbUncheckedColor = Color.parseColor("#ECECEC");
            int trackCheckedColor = sharedPreferences.getInt("theme_color_key",Color.parseColor("#3F51B5"));
            int trackUncheckedColor = Color.parseColor("#B9B9B9");
            if(enabled)
                aSwitch.getThumbDrawable().setColorFilter(checked ? thumbCheckedColor : thumbUncheckedColor, PorterDuff.Mode.MULTIPLY);
                aSwitch.getTrackDrawable().setColorFilter(checked ? trackCheckedColor : trackUncheckedColor, PorterDuff.Mode.MULTIPLY);
            else 
                aSwitch.getThumbDrawable().setColorFilter(Color.parseColor("#B9B9B9"), PorterDuff.Mode.MULTIPLY);
                aSwitch.getTrackDrawable().setColorFilter(Color.parseColor("#E9E9E9"), PorterDuff.Mode.MULTIPLY);
            
        catch (NullPointerException e)
            e.printStackTrace();
        
    

    private Switch findSwitchInChildViews(ViewGroup view) // find the Switch widget in the SwitchPreference
        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;
    

基本上,您使用findSwitchInChildViews() 在 SwitchPreference 中获取 Switch 小部件,然后从那里更改颜色。

就是这样!这实际上是一个非常简单的方法,但我之前没有考虑过,希望这篇文章可以帮助将来的人避免我的挣扎。

(PS:我得到了从here找到Switch的代码,从here更改Switch颜色,谢谢!)

【讨论】:

以上是关于Android - 如何动态更改 SwitchPreference 开关的拇指/轨道颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中动态更改菜单项文本

Android - 如何动态更改 SwitchPreference 开关的拇指/轨道颜色

如何在Android中动态更改文本大小

如何在 Android O 中动态更改通知声音

如何在 PlaybackTransportControlGlue android TV 上动态更改字幕

如何在运行时更改动态添加的 Android 视图中的数据