如我在问题中所述,按钮的功能与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>
背景可绘制对象是一个 layer-list 的 xml 文件,它指向另一个可绘制对象(也许有一些方法可以摆脱这个文件并直接指向下面的选择器?)
<?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个图像文件),而这只是为了创建一个相当普通的按钮。
这不可能是正确的!