正如我在问题中所写,按钮的功能与 ToggleButton 非常匹配,因此我从一个布局开始,该布局在一些文本旁边显示了一个样式化的 ToggleButton:
<RelativeLayout
android:id="@+id/expandLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_marginRight="12dp" >
<ToggleButton
android:id="@+id/expcollButton"
style="@style/expCollToggleBtn"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="false"/>
<TextView
android:id="@+id/expandText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="8dp"
android:layout_toRightOf="@id/expcollButton"
android:text="Show Options" />
</RelativeLayout>
样式(在 styles.xml 文件中)如下所示。这会使按钮文本无效并指向背景可绘制对象。
<style name="expCollToggleBtn">
<item name="android:background">@drawable/expcoll_btn_toggle_bg_light</item>
<item name="android:textOn"></item>
<item name="android:textOff"></item>
<item name="android:disabledAlpha">?android:attr/disabledAlpha</item>
</style>
背景drawable是一个layer-list xml文件,它指向另一个drawable(也许有办法摆脱这个文件,直接指向下面的选择器?)
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+android:id/background" android:drawable="@android:color/transparent" />
<item android:id="@+android:id/toggle" android:drawable="@drawable/expcoll_btn_toggle" />
</layer-list>
选择器列出了打开/关闭的图像:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="false" android:drawable="@drawable/ic_action_expand" />
<item android:state_checked="true" android:drawable="@drawable/ic_action_collapse" />
</selector>
现在,第一个复杂情况是这会导致按钮/图像过大。我已经为所有像素密度提供了合适的图像,所以我不确定为什么会发生这种情况,但解决方案是缩放图像。
不幸的是,这似乎需要为每个图像提供一个 ScaledDrawable。我实际上有四个图像,因为我愚蠢地决定在我的应用程序中支持浅色和深色主题。所以我需要其中的四个。
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_action_expand"
android:scaleGravity="center"
android:scaleHeight="50%"
android:scaleWidth="50%"
/>
另外,请注意 ScaledDrawables 中存在一个错误,在此处描述,因此需要加以考虑。
最后,由于我试图支持两个主题,我还需要选择器和图层列表文件的多个副本,并且需要向 attrs.xml 文件添加属性。在这一点上,我有 11 个 XML 文件(加上所有密度的 10 个图像文件)全部用于一个非常普通的按钮。
这不可能!