【问题标题】:How to apply shape and selector simultaneously for Button?如何同时为 Button 应用形状和选择器?
【发布时间】:2011-11-28 06:01:22
【问题描述】:

我为按钮应用了一个形状,例如:

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle" >
    <gradient android:startColor="#DD000000" android:endColor="#DD2d2d2d"  android:angle="90"></gradient>
    <corners android:radius="15dip"></corners>

</shape>

现在我想使用如下选择器:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/active"
      android:state_pressed="true" />
<item android:drawable="@drawable/passive"/>

对于这个按钮也是如此。有没有可能……???

【问题讨论】:

    标签: android button selector


    【解决方案1】:

    这样使用:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
       <item android:state_pressed="true" >
           <shape>.......</shape>
       </item>
       ..........
       ..........
    </selector>
    

    【讨论】:

    • 是的,它通过使用:schemas.android.com/apk/res/android">
    • @KhawarRaza 以后,请在您的问题中输入此类信息,这样可以更轻松地进行格式化和查找。评论往往会随着时间的推移而消失。
    • 我尝试按照您的建议在 item 元素中添加一个 shape 元素,但它只是出错并显示一条无济于事的消息09-13 15:25:02.868: ERROR/AndroidRuntime(9129): FATAL EXCEPTION: main android.view.InflateException: Binary XML file line #13: Error inflating class &lt;unknown&gt;. 我将选择器设置为android:background 属性RoundedImageView [github.com/vinc3m1/RoundedImageView#usage]。有没有人知道如何做到这一点?
    • 尝试使用此技术时,我不断收到错误消息。 AZ_ 的回答对我来说效果更好。
    • @Alan Nelson,我的回答只是骨架,而 AZ_ 已经给出了例子。
    【解决方案2】:

    详细回答

    在中创建颜色资源

    res/values/colors.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    
    
        <item name="yellow" type="color">#F7B500</item>
        <item name="yellow_dark" type="color">#AC7E00</item>
    
        <integer-array name="androidcolors">
            <item>@color/yellow</item>
            <item>@color/yellow_dark</item>
        </integer-array>
    
    </resources>
    

    在以下位置创建一个可绘制对象

    res/drawable/bg_yellow_round.xml

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle" >
    
        <solid android:color="@color/yellow" />
    
        <stroke
            android:width="2dp"
            android:color="@color/yellow" />
    
        <corners
            android:bottomLeftRadius="20dp"
            android:bottomRightRadius="20dp"
            android:topLeftRadius="20dp"
            android:topRightRadius="20dp" />
    
    </shape>
    

    创建另一个drawable,你想在同一个地方进行过渡并命名

    res/drawable/bg_yellow_dark_round.xml

    <solid android:color="@color/yellow_dark" />
    
    <stroke
        android:width="2dp"
        android:color="@color/yellow_dark" />
    
    <corners
        android:bottomLeftRadius="20dp"
        android:bottomRightRadius="20dp"
        android:topLeftRadius="20dp"
        android:topRightRadius="20dp" />
    

    现在创建一个color state list@

    res/color/btn_selector_yellow.xml

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_shortAnimTime">
    
        <item android:drawable="@color/yellow" android:state_focused="true" android:state_pressed="false"/>
        <item android:drawable="@drawable/bg_yellow_dark_round" android:state_pressed="true"/>
        <item android:drawable="@drawable/bg_yellow_round"/>
    
    </selector>
    

    现在将其设置为您的按钮,如下所示

    <Button
                    android:id="@+id/button1"
                    android:layout_width="248dp"
                    android:layout_height="44dp"
                    android:layout_gravity="center_horizontal"
                    android:layout_marginBottom="10dp"
                    android:layout_marginTop="20dp"
                    android:background="@color/btn_selector_yellow"
                    android:text="AZ_ is so cool" />
    

    现在这将进行转换

    .

    【讨论】:

    【解决方案3】:

    shape.xml

    <shape xmlns:android="http://schemas.android.com/apk/res/android">
        <solid android:color="@color/star_off"/>
        <corners android:radius="5dp"/>
        <padding android:left="0dp" android:top="0dp" android:right="0dp" android:bottom="0dp" />
    </shape>
    

    selector.xml

    <selector xmlns:android="http://schemas.android.com/apk/res/android" android:exitFadeDuration="@android:integer/config_mediumAnimTime">
    
        <item android:drawable="@color/tab_focused" android:state_focused="true" android:state_pressed="false"/>
        <item android:drawable="@color/tab_pressed" android:state_pressed="true"/>
        <item android:drawable="@drawable/shape"/>
    
    </selector>
    

    【讨论】:

    • 使用@drawable/shape 代替@drawable/shape.xml
    【解决方案4】:

    您还可以创建一个在内部使用选择器的形状。如果你的形状只是在不同的状态下改变它的颜色,这会干净很多。

    color/color_selector.xml

    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:color="@color/blue_dark" android:state_pressed="true" />
        <item android:color="@color/blue_light" />
    </selector>
    

    drawable/shape.xml

    <shape xmlns:android="http://schemas.android.com/apk/res/android">
        <solid android:color="@color/color_selector" />
        <corners android:bottomLeftRadius="6dip" android:bottomRightRadius="6dp" />
        <padding android:bottom="0dip" android:left="0dip" android:right="0dip" android:top="0dip" />
    </shape>
    

    【讨论】:

    【解决方案5】:

    好吧,我知道为时已晚 但这是一个解决的例子

     <TextView
                android:id="@+id/txt_out_going_calls"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="04dp"
                android:layout_weight="1"
                android:background="@drawable/header_text_view_selector"
                android:gravity="center"
                android:text="@string/outgoing_calls_tab_button_text"
                android:textColor="@color/home_text_color" />
    

    还有我的header_text_view_selector

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_selected="true">
    
            <shape xmlns:android="http://schemas.android.com/apk/res/android">
                <solid android:color="@color/home_fragment_tab_color_selected"/>
                <corners android:radius="25dip" />
                <padding android:bottom="08dip" android:left="9dip" android:right="9dip" android:top="08dip" />
            </shape>
        </item>
        <item android:state_selected="false">
    
            <shape>
                <solid android:color="@color/home_fragment_tab_color_simple"/>
                <corners android:radius="25dip" />
                <padding android:bottom="08dip" android:left="9dip" android:right="9dip" android:top="08dip" />
            </shape>
        </item>
    </selector>
    

    所以基本上我正在创建一个带有选择器的圆形textview。这里我只处理state_selectednot_selected。希望对你有帮助

    【讨论】:

      【解决方案6】:

      这是我的方式,而且有效!

      <item android:state_pressed="true">
      
          <shape android:shape="oval">
      
      
              <gradient android:centerX=".6"
                  android:centerY=".40"
                  android:endColor="@color/colorPrimary"
                  android:gradientRadius="20"
                  android:startColor="@color/colorPrimary"
                  android:type="radial" />
      
              <stroke android:width="1dp"
                  android:color="#FFFFFF" />
      
              <size android:width="55dp"
                  android:height="55dp" />
      
          </shape>
      </item>
      
      <item android:state_focused="false">
          <shape android:shape="oval">
      
      
              <gradient android:centerX=".6"
                  android:centerY=".40"
                  android:endColor="@android:color/transparent"
                  android:gradientRadius="20"
                  android:startColor="@android:color/transparent"
                  android:type="radial" />
      
              <stroke android:width="1dp"
                  android:color="#FFFFFF" />
      
              <size android:width="55dp"
                  android:height="55dp" />
      
          </shape>
      </item>
      

      【讨论】:

        【解决方案7】:

        在使用任何图像时使用形状名称,在使用图像时使用选择器。试试看你不会遇到任何问题。你问的是这个吗?

        【讨论】:

        • 将你的 shape xml 放入 drawable 并在你的选择器中传递 android:drawable="@drawable/shape_xml" 并在你的视图中使用你的选择器......
        • 请使用代码 sn-p 以更好的形式编写您的示例。
        【解决方案8】:

        我的示例是带有 state_pressed 的圆形按钮。 代码如下:

        <?xml version="1.0" encoding="utf-8"?>
        <selector xmlns:android="http://schemas.android.com/apk/res/android">
        
        
            <item android:state_pressed="true">
                <shape android:shape="oval">
                    <solid android:color="@color/light_primary_color" />
                </shape>
        
            </item>
            <item>
                <shape android:shape="oval">
                    <solid android:color="@color/accent_color" />
                </shape>
            </item>
        
        </selector>
        

        【讨论】:

          【解决方案9】:

          为了更加可重用,您可以在单个属性上设置状态。 避免重复你的形状

          <selector
              xmlns:android="http://schemas.android.com/apk/res/android"
          >
              <item>
                  <shape android:shape="rectangle" >
                      <corners android:radius="5dp"/>
                      <solid
                          android:state_enabled="false"
                          android:color="@color/transparent"
                      />
                      <solid
                          android:state_enabled="true"
                          android:color="@color/background"
                      />
                      <stroke
                          android:width="@dimen/dividerHeight"
                          android:color="@color/dividerLight"
                      />
                  </shape>
              </item>
          </selector>
          

          使用此方法禁用后,我能够以编程方式设置背景。

          【讨论】:

          • 这似乎不起作用。我认为选择器必须有多个子项,并且必须在每个项上设置状态。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多