【问题标题】:Android Set ImageButton as ToggleAndroid 将 ImageButton 设置为切换
【发布时间】:2010-04-26 20:38:14
【问题描述】:

如何让图像按钮在单击时保持“按下”状态?基本上我只是希望背景是郁闷的背景,但我不知道如何设置它。目前,我刚刚将选定的按钮背景复制到我的 res 文件夹中,但是当我将其设置为背景时,它变得模糊(因为原始图像比按钮本身大)。

普通背景: alt text http://img707.imageshack.us/img707/9199/ss20100426163452.png 我得到了什么: alt text http://img707.imageshack.us/img707/912/ss20100426163357.png alt text http://img3.imageshack.us/img3/8304/ss20100426163623.png

另外,考虑到许多不同的 UI 布局,我不相信我真的可以使用这种方法。根据用户使用的 UI,该按钮应保持按下状态。

【问题讨论】:

  • 您确定不要ToggleButton 而不是ImageButton
  • 切换按钮仍然不允许我将按钮设置为按下状态。我将不得不为每个按钮手动制作自定义图标。我只想让背景图片成为按下的图片。

标签: android layout toggle imagebutton


【解决方案1】:

有几种方法可以做到这一点:

首先,您可以简单地使用ImageButton,并在Java 中手动切换其可绘制的图像。例如,这就是 Android does for the shuffle button 上的 stock Music player。尽管您无法控制处于选中状态的按钮背景,但您可以换出图像,从 Android UI 一致性的角度来看,这可能是有利的。

另一种选择是使用一组复杂的可绘制对象和九个补丁来获取ToggleButton 中的图像,并可以选择在切换时更改背景和/或图像资源。这就是我将在下面展示的选项。但请记住,在执行此操作之前,请注意 UI 一致性。


res/layout/foo.xml

...
<ToggleButton
    android:textOn="" android:textOff=""
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/shuffle_button" />
...

res/drawable/shuffle_button.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- use "@android:drawable/btn_default" to keep consistent with system -->
    <item android:drawable="@drawable/toggle_button_background" />
    <item android:drawable="@drawable/shuffle_button_image" />
</layer-list> 

res/drawable/toggle_button_background.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- checked state -->
    <item android:state_pressed="false" android:state_checked="true"
          android:drawable="@drawable/btn_default_checked" />

    <item android:state_window_focused="false" android:state_enabled="true"
          android:drawable="@drawable/btn_default_normal" />
    <item android:state_window_focused="false" android:state_enabled="false"
          android:drawable="@drawable/btn_default_normal_disable" />
    <item android:state_pressed="true"
          android:drawable="@drawable/btn_default_pressed" />
    <item android:state_focused="true" android:state_enabled="true"
          android:drawable="@drawable/btn_default_selected" />
    <item android:state_enabled="true"
          android:drawable="@drawable/btn_default_normal" />
    <item android:state_focused="true"
          android:drawable="@drawable/btn_default_normal_disable_focused" />
    <item android:drawable="@drawable/btn_default_normal_disable" />
</selector>

res/drawable/shuffle_button_image.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/ic_mp_shuffle_on_btn" android:state_checked="true" />
    <item android:drawable="@drawable/ic_mp_shuffle_off_btn" />
</selector>

图像文件

警告:如果您使用这些,您的应用在具有自定义 OS UI(即 HTC 的 Sense UI)的设备上看起来会不一致。

  • ic_mp_shuffle_&lt;state&gt;_btn.9.png 需要九个补丁,以便图像居中而不是拉伸以适合按钮。以下是图标的示例hdpi 版本:

res/drawable-(h|m|ldpi)/ic_mp_shuffle_(on|off)_btn.9.png


最后说明:请记住尽可能与系统 UI 保持一致,并注意您的应用可能在具有自定义版本的操作系统的设备上运行,这些操作系统的 UI 元素具有不同的图形像按钮。这方面的一个例子是HTC Sense,它用绿色按钮代替了Android 中的灰色/橙色/黄色按钮。因此,如果您最终从开源存储库复制 btn_default_... PNG 文件以创建可切换按钮背景,您将破坏这些设备上的一致性。

【讨论】:

  • 我想没有办法直接从操作系统本身访问资源,以便每次都能获取正确的背景?
  • 不,因为@android:drawable/btn_default_normal 之类的(九个补丁)不公开,但@android:drawable/btn_default(选择器)是公开的。不幸的是,选择器不包含选中状态。
  • 底部的图片是什么?你能修好它们吗?
猜你喜欢
  • 2014-08-18
  • 1970-01-01
  • 2013-03-05
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
相关资源
最近更新 更多