使用SwitchPreference设置更改Android偏好设置图标

4

我的安卓应用中有一个SwitchPreference,可以设置为“on”或“off”。我有一个适用于此SwitchPreference的图标。以下是XML代码:

<SwitchPreference
    android:title="@string/psm_pinterest"
    android:defaultValue="false"
    android:key="@string/pref_social_pinterest"
    android:icon="@drawable/pinterest_bw"
    android:summaryOn="@string/psm_pinterest_summary_on"
    android:summaryOff="@string/psm_pinterest_summary_off"/>

然而,我也希望在SwitchPreference更改时,icon也能相应变化。有没有通过XML实现的方法?我尝试使用“状态”设置创建一个“drawable”xml文件,但是当我改变SwitchPreference设置时,没有任何一个“状态”被调用。我现在正在以编程方式处理它,但我正在寻找一种更有效的通过XML本身实现的方法。感谢您的帮助。

2
据我所知,仅使用XML无法实现这一点。 - azizbekian
@azizbekian - 像往常一样,感谢您的专业意见... - Abhishek
2个回答

1

如果您想通过仅创建XML而无需以编程方式处理即可更改图标,则需要做很多工作才能完成,并且仍然需要在您的Java / Kotlin中编写一些代码。

这是我尝试过的方法:

我已经尝试过这种方法,它可以更改图标,但是正如我所说,在我看来,这种方法并不推荐。以编程方式处理图标更好,更有效。

调整您的SwitchPreference

<SwitchPreference
    android:title="@string/psm_pinterest"
    android:defaultValue="false"
    android:key="@string/pref_social_pinterest"/>

首先,在您的设置片段/活动中

将布局设置为替换SwitchPreference视图并创建开关监听器。 例如,像这样:

SwitchPreference prefSocPin = (SwitchPreference) findPreference(getString(R.string.pref_social_pinterest));
prefSocPin.setWidgetLayoutResource(R.layout.pinterest_switch); // THIS IS THE KEY OF ALL THIS. HERE YOU SET A CUSTOM LAYOUT FOR PreferenceSwitch

prefSocPin.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        // Here you can enable/disable whatever you need to
        return true;
    }
});

其次,创建名为pinterest_switch.xml的布局文件

例如,像这样:

<?xml version="1.0" encoding="utf-8"?>
<Switch xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/pinterest_switch_item"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:textIsSelectable="false"
    android:track="@drawable/pinterest_track" 
    android:thumb="@drawable/pinterest_thumb"/>

第三步,在drawable中

和你第一次尝试一样,在drawable中创建用于状态监听的xml,但这次你需要创建两个项目。一个用于轨道,一个用于滑块。

pinterest_track.xml

<?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>

pinterest_thumb.xml

<?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>

我正在根据您的需求进行一些调整,跟随this reference

总之,仅通过创建xml来更改图标是一项更加困难和无效的工作,在我看来。 好吧,我仍在努力回答您想要的问题。享受吧。


抱歉,我正在寻找一种更有效的方法。你的答案显然不够高效。虽然感谢你的努力... - Abhishek
有效的方法是只通过编程设置图标,据我所知。 - Dhanial Rizky Wira Putra

0
经过广泛的研究和咨询,目前似乎没有办法仅通过XML来完成这个任务而不编写任何相关代码。我会继续关注,如果有可能实现,我会更新答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接