【问题标题】:Minimum resources for a rounded rect button selector in Android?Android中圆形矩形按钮选择器的最小资源?
【发布时间】:2014-03-19 22:43:47
【问题描述】:

这是我正在尝试构建的按钮选择器的布局:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_enabled="true" android:state_pressed="true" android:drawable="@drawable/btt_down" />
    <item android:state_enabled="false" android:drawable="@drawable/btt_disabled" />
    <item android:drawable="@drawable/btt_normal"/>
</selector>

这是正常状态按钮的布局 (btt_normal.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/btt_normal"/>

    <corners
        android:radius="@dimen/rounded_rect_corner_radius"
        />

    <padding
        android:left="@dimen/rounded_rect_padding"
        android:top="@dimen/rounded_rect_padding"
        android:right="@dimen/rounded_rect_padding"
        android:bottom="@dimen/rounded_rect_padding"
        />

</shape>


此布局与 btt_down.xml 和 btt_disabled.xml 的布局之间的唯一区别是这一行:

    <solid android:color="@color/..."/>

我想知道是否有办法定义中性(无颜色)圆角矩形可绘制资源,并以某种方式(继承?)为其分配不同的颜色并在选择器中使用它们?

我知道我可以通过将所有圆角矩形定义为选择器的一部分来减少资源,但是为了维护起见,我非常希望避免一次又一次地复制/粘贴相同的代码行区分它们的颜色线。

谢谢。

【问题讨论】:

    标签: android xml button user-interface


    【解决方案1】:

    你可以像这样定义一个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="#000000" /> <!-- pressed -->
     <item android:state_focused="true"
           android:color="#000000" /> <!-- focused -->
     <item android:color="#FFFFFF" /> <!-- default -->
    </selector>
    

    在您的 res/color 文件夹中,并将其用作可绘制布局中的颜色。

    【讨论】:

    • 我喜欢使用特定资源创建颜色文件夹的想法(当时不知道),但是,我没有看到神奇的事情发生。这是我所做的: 1. 将您建议的 XML 添加为 res/color/btt_bg.xml,2. 使用 &lt;solid android:color="@color/btt_bg"/&gt; 将其分配给我的 btt_normal.xml 实体,3. 在我的主片段布局中创建一个 Button 资源并分配 btt_normal.xml 作为它的背景(不使用我的问题描述中的选择器或其他 btt_disabled 和 btt_pressed 资源)。我错过了什么吗?
    • 我认为它会起作用,但在阅读此stackoverflow.com/questions/8169257/… 之后,颜色选择器似乎不适用于形状
    【解决方案2】:

    要回答我自己的问题,我找不到避免重新定义矩形的方法。 因此,我没有为每个状态(正常、按下、聚焦、禁用)加上一个选择器文件而拥有一个文件,而是最终将所有状态放在一个选择器文件中,只在状态之间进行颜色区分。前景色也是一个选择器,颜色和矩形尺寸取自值资源文件。

    这是所有参与文件的目录大纲:

    project
      +-color
        + btt_fg_selector.xml
      +-drawable
        + btt_bg_selector.xml
      +-res
        +-colors.xml
        +-dimens.xml
    

    以下是具有 pressednormal 状态的选择器文件,以及为了完整的答案 - 值资源文件:

    btt_bg_selector.xml

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    
        <!-- pressed -->
        <item android:state_pressed="true">
        <shape>
            <solid android:color="@color/btt_bg_pressed" /> 
            <corners android:radius="@dimen/btt_rr_radius" /> 
            <padding android:left="@dimen/btt_rr_padding" android:top="@dimen/btt_rr_padding" android:right="@dimen/btt_rr_padding" android:bottom="@dimen/btt_rr_padding" /> 
        </shape>
        </item>
    
        <!-- normal/default -->
        <item>
        <shape>
            <solid android:color="@color/btt_bg_normal" /> 
            <corners android:radius="@dimen/btt_rr_radius" /> 
            <padding android:left="@dimen/btt_rr_padding" android:top="@dimen/btt_rr_padding" android:right="@dimen/btt_rr_padding" android:bottom="@dimen/btt_rr_padding" /> 
        </shape>
        </item>
    
    </selector>
    

    btt_fg_selector.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="@color/btt_fg_pressed" /> <!-- pressed -->
        <item android:color="@color/btt_fg_normal" /> <!-- normal/default -->
    </selector>
    

    colors.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <color name="btt_bg_normal">#0000ff</color>
        <color name="btt_bg_pressed">#ffff00</color>
    
        <color name="btt_fg_normal">#ffff00</color>
        <color name="btt_fg_pressed">#ff0000</color>
    </resources>
    

    dimens.xml

    <resources>
        <!-- Round rect values -->
        <dimen name="btt_rr_radius">15dp</dimen>
        <dimen name="btt_rr_padding">10dp</dimen>
    </resources>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-18
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多