【问题标题】:Android issue in Background Drawable with layer-list with API v16带有 API v16 的图层列表的背景可绘制的 Android 问题
【发布时间】:2016-02-13 18:00:10
【问题描述】:

我正在尝试实现这样的目标:

我创建的代码在 API v21 及更高版本上运行良好,但无法按预期运行。这里有sn-p的代码供大家参考。

Drawable 用作 EditText 小部件 ID (drawable_edittext_username.xml) 的背景:

file: drawable_edittext_username.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" 
                  android:paddingLeft="44dp" android:paddingStart="44dp">
    <item android:drawable="@drawable/drawable_rounded_box"/>
    <item android:gravity="center_vertical|left">
        <selector >
            <item android:drawable="@drawable/vector_icon_user_focused" 
                  android:state_focused="true"/>
            <item android:drawable="@drawable/vector_icon_user"/>
        </selector>
    </item>
</layer-list>

file: drawable_rounded_box.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" 
                android:paddingLeft="44dp" 
                android:paddingStart="44dp">
    <item android:drawable="@drawable/drawable_rounded_box_focused" 
          android:state_focused="true" />
    <item android:drawable="@drawable/drawable_rounded_box_normal" />
</selector>

file: drawable_rounded_box_focused.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
             android:shape="rectangle">
    <stroke
        android:width="1dp"
        android:color="@color/colorPrimaryDark" />
    <corners android:radius="5dp" />
    <padding
        android:bottom="10dp"
        android:left="10dp"
        android:right="10dp"
        android:top="10dp" />
    <solid android:color="@android:color/transparent"/>
</shape>

file: drawable_rounded_box_normal.xml*
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
             android:shape="rectangle">
    <stroke
        android:width="1dp"
        android:color="#3f000000" />
    <corners android:radius="5dp" />
    <padding
        android:bottom="10dp"
        android:left="10dp"
        android:right="10dp"
        android:top="10dp" />
    <solid android:color="@android:color/transparent"/>
</shape>

所有图标都是可在 drawable 和 drawable-v21 文件夹中使用的矢量图标。

在 v16 的输出中,没有填充,图标散布而没有颜色。这是图标的代码:

file: vector_icon_user.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="24.0"
    android:viewportWidth="24.0">
    <path
        android:fillColor="#3f000000"
        android:pathData="M12 14.016q2.531 0 5.273 1.102t2.742
        2.883v2.016h-16.031v-2.016q0-1.781 2.742-2.883t5.273-1.102zM12
        12q-1.641 0-2.813-1.172t-1.172-2.813 1.172-2.836 2.813-1.195
        2.813 1.195 1.172 2.836-1.172 2.813-2.813 1.172z" />
</vector>

file: vector_icon_user_focused.xml
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportHeight="24.0"
    android:viewportWidth="24.0">
    <path
        android:fillColor="@color/colorAccent"
        android:pathData="M12 14.016q2.531 0 5.273 1.102t2.742
        2.883v2.016h-16.031v-2.016q0-1.781 2.742-2.883t5.273-1.102zM12
        12q-1.641 0-2.813-1.172t-1.172-2.813 1.172-2.836 2.813-1.195
        2.813 1.195 1.172 2.836-1.172 2.813-2.813 1.172z" />
</vector>

最后是 API v16 的输出:

请帮助我理解,我做错了什么以及实现相同目标的正确方法是什么。

【问题讨论】:

    标签: android android-layout android-drawable xml-drawable


    【解决方案1】:

    这是我为解决而采取的措施(后备方法),因为 v23 以下的 API 不支持我尝试实现的方式(目前仅在 API v23 中才有可能)

    file: vector_icon_user_focused.xml
    <?xml version="1.0" encoding="utf-8"?>
    <vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportHeight="24.0"
        android:viewportWidth="24.0">
        <path
            android:fillColor="#ACFDE9"
            android:pathData="M12 14.016q2.531 0 5.273 1.102t2.742
            2.883v2.016h-16.031v-2.016q0-1.781 2.742-2.883t5.273-1.102zM12
            12q-1.641 0-2.813-1.172t-1.172-2.813 1.172-2.836 2.813-1.195
            2.813 1.195 1.172 2.836-1.172 2.813-2.813 1.172z" />
    </vector>
    

    这里的填充颜色是硬编码的。

    文件drawable_edittext_username.xml 已被删除,文件drawable_rounded_box.xml 用于替代EditText 背景可绘制对象。

    文件vector_icon_user.xml 被重命名为vector_icon_user_normal.xml 并创建了名为vector_icon_user.xml 的新文件,其中包含vector_icon_user_normal.xmlvector_icon_user_focused.xml 的选择器,如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_focused="false" 
              android:drawable="@drawable/vector_icon_user_focused" />
        <item android:drawable="@drawable/vector_icon_user_normal" />
    </selector>
    

    现在这个新的drawable被用作android:drawableLeft="@drawable/vector_icon_user"android:drawablePadding="10dp"

    在上面的代码之后,它在所有设备上都是统一的。现在我没有任何用于可绘制和布局的 v21 特定代码。

    如果您有任何问题,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多