Android Background Drawable 中的问题 API v16
Android issue in Background Drawable with layer-list with API v16
我正在努力实现这样的目标:
我创建的代码在 API v21 及更高版本上运行良好,但未按预期运行。以下是代码片段供您参考。
用作 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 上的输出:
请帮助我理解我做错了什么以及实现相同目标的正确方法是什么。
这是我为解决(后备方法)所做的工作,因为我试图实现的方式不受 v23 以下的 APIs 支持(以上仅在 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.xml
和 vector_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>
现在这个新的可绘制对象被用作 android:drawableLeft="@drawable/vector_icon_user"
和 android:drawablePadding="10dp"
。
在上面的代码之后,它在所有设备上都是统一的。现在我没有任何用于可绘制对象和布局的 v21 特定代码。
如果您有任何问题,请告诉我。
我正在努力实现这样的目标:
我创建的代码在 API v21 及更高版本上运行良好,但未按预期运行。以下是代码片段供您参考。
用作 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 上的输出:
请帮助我理解我做错了什么以及实现相同目标的正确方法是什么。
这是我为解决(后备方法)所做的工作,因为我试图实现的方式不受 v23 以下的 APIs 支持(以上仅在 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.xml
和 vector_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>
现在这个新的可绘制对象被用作 android:drawableLeft="@drawable/vector_icon_user"
和 android:drawablePadding="10dp"
。
在上面的代码之后,它在所有设备上都是统一的。现在我没有任何用于可绘制对象和布局的 v21 特定代码。
如果您有任何问题,请告诉我。