【问题标题】:Apply Different Style to Button When Pressed按下时对按钮应用不同的样式
【发布时间】:2011-04-13 09:55:15
【问题描述】:

有没有办法在按下按钮时将样式应用于按钮?

如果我在 style.xml 中有样式:

<resources>
    <style name="test">
        <item name="android:textStyle">bold</item>
    </style>
</resources>

button.xml 中的选择器:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/test_pressed"
              style="@style/test"
          android:state_pressed="true"/>
    <item android:drawable="@drawable/test_focused"
          android:state_focused="true"/>
    <item android:drawable="@drawable/test_normal"/>
</selector>

那么我将如何在我的布局中引用 button.xml

<Button
        ...
        android:???="button"/>

谢谢!

【问题讨论】:

    标签: android button coding-style pressed


    【解决方案1】:

    在单击/按下颜色时更改 Android 按钮:

    定义颜色值

    要定义颜色值,您必须在项目值目录中创建 colors.xml 文件并添加以下内容。 res/values/colors.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <color name="button_pressed">#ff8a00</color>
        <color name="button_focused">#ff8a00</color>
        <color name="button_default">#1c76bb</color>
    </resources>
    

    在 Drawable 目录中创建 XML 文件

    在您的可绘制文件夹中创建一个 button_background.xml 文件,并添加按钮按下/单击、聚焦和默认颜色。 button_background.xml 文件的最终代码如下所示。 res/drawable/button_background.xml

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_pressed="true"
            android:drawable="@color/button_pressed"/> <!-- pressed -->
        <item android:state_focused="true"
            android:drawable="@color/button_focused"/> <!-- focused -->
        <item android:drawable="@color/button_default"/> <!-- default -->
    </selector>
    

    添加按钮

    res/activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity">
    
        <Button
            android:id="@+id/button1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/button_background"
            android:text="Click Me"
            android:textColor="#fff" />
    
        <Button
            android:id="@+id/button2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/button1"
            android:layout_marginTop="16dp"
            android:background="@drawable/button_background"
            android:text="Click Me"
            android:textColor="#fff" />
    
    </RelativeLayout>
    

    来源here

    【讨论】:

      【解决方案2】:

      您可以使用Color State List Resource

      链接示例:

      XML 文件保存在 res/color/button_text.xml:

      <?xml version="1.0" encoding="utf-8"?>
      <selector xmlns:android="http://schemas.android.com/apk/res/android">
          <item android:state_pressed="true"
                android:color="#ffff0000"/> <!-- pressed -->
          <item android:state_focused="true"
                android:color="#ff0000ff"/> <!-- focused -->
          <item android:color="#ff000000"/> <!-- default -->
      </selector>
      

      此布局 XML 会将颜色列表应用于视图:

      <Button
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:text="@string/button_text"
          android:textColor="@color/button_text" />
      

      【讨论】:

        【解决方案3】:

        Romain Guy 认为这是不可能的:

        http://code.google.com/p/android/issues/detail?id=8941

        “选择器仅适用于可绘制对象,不适用于文本外观。有 目前不打算实现这一点。”

        【讨论】:

          【解决方案4】:

          您可以通过使用 XML 按钮定义来实现这一点。

          在您的可绘制文件夹中创建一个 XML 文件,如下所示:

          <?xml version="1.0" encoding="utf-8"?>
          <selector xmlns:android="http://schemas.android.com/apk/res/android">
          
                  <item android:state_pressed="true"
                  android:drawable="@drawable/green_button" /> 
          
                  <!-- <item android:state_focused="true"
                  android:drawable="@drawable/button_focused" /> --> 
          
                  <item android:drawable="@drawable/black_button" />
          </selector>
          

          如您所见,这允许您定义不同的按钮图像以用于不同的状态(black_button、green_button 等也应该是可绘制文件夹中的 .PNG 文件)

          现在,您可以从您的 layout.xml 文件中将按钮背景设置为指向按钮选择器:

          <Button android:text="Play" android:id="@+id/playBtn"
                      android:background="@drawable/button_selector"
                      android:textColor="#ffffff" />
          

          然后可以像任何图像文件一样从可绘制文件夹中引用选择器 XML。

          【讨论】:

          • 这并没有真正解决我的问题......这只允许我更改按钮的背景图像。我在问我是否能够在按下时通过 XML 将样式应用于按钮(例如,将文本加粗)。
          【解决方案5】:

          要引用选择器,您必须将其作为该按钮的背景。

          <Button
               android:background="@drawable/button"
          /> 
          

          对于按下时的粗体,我也没有尝试过,但也许你可以在选择器中提及文本样式,i.s.o 指的是其中的样式:

          android:textStyle="bold"
          

          如果这也不起作用,您可以在按钮的 onClick() 中进行。

          【讨论】:

          • android:background 在 button.xml 中忽略了我的“按下”状态的样式。我以前试过。我不认为我可以轻松地通过 XML 将样式应用于按钮。
          【解决方案6】:
          <Button
                  android:background="@drawable/button"/>
          

          【讨论】:

          • 我试过用这个,但它不起作用......你自己试过吗?告诉我!
          • 是的。应该可以正常工作 - 请参阅此处的 imageview 示例developer.android.com/guide/topics/resources/…
          • 并从您的 button.xml 中删除 style="@style/test" 它应该转到
          • 但是如果我将 style="@style/test" 移动到
          【解决方案7】:

          我没有尝试过,但大概你可以在选择器中包含android:id="button"

          【讨论】:

          • 你的回答让我有点困惑。你能详细说明一下吗?所以我会使用 android:id="button"? 在我的布局中引用 button.xml
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-28
          • 2019-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多