带有颜色资源的Android LinearLayout:我做错了啥?
Posted
技术标签:
【中文标题】带有颜色资源的Android LinearLayout:我做错了啥?【英文标题】:Android LinearLayout with color resource: What am I doing wrong?带有颜色资源的Android LinearLayout:我做错了什么? 【发布时间】:2011-03-31 04:43:55 【问题描述】:我按照this tutorial 为特定的 android 视图创建了颜色状态列表。我只是希望它在单击时突出显示,以便用户知道为什么屏幕刚刚改变。
当视图被渲染时,我得到以下错误:
org.xmlpull.v1.XmlPullParserException:二进制 XML 文件第 3 行:标签需要“drawable”属性或定义可绘制对象的子标签
我的颜色 XML(在 res/color/viewcolor.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="#ff33ffff"/> <!-- pressed -->
<item android:color="#ff000000"/> <!-- default -->
</selector>
我的布局 XML(在 res/layout/myview.xml 中):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myview"
android:orientation="horizontal"
android:layout_
android:layout_
android:gravity="top"
android:background="@color/viewcolor">
<!--crap in the layout-->
</LinearLayout>
我错过了什么?
【问题讨论】:
如果有人想获得完整的解决方案,请检查此存储库:github.com/shamanland/AndroidLayoutSelector 有自定义可点击/可检查LinearLayout
就像 ToggleButton
【参考方案1】:
我记得我通过使用 state drawable 而不是 state color 解决了这个错误。由于某种原因,布局背景不适用于有状态的颜色。因此,请尝试创建一个有状态的可绘制对象(例如具有不同颜色的形状可绘制对象列表)并将其用作背景。
res/drawable/pressed.xml:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<solid android:color="#ff33ffff" />
</shape>
res/drawable/normal.xml:
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<solid android:color="#ff000000" />
</shape>
res/drawable/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="@drawable/pressed" />
<item android:drawable="@drawable/normal" />
</selector>
然后使用 background.xml drawable 作为背景:)
【讨论】:
效果很好。不过,奇怪的是颜色不能完全发挥作用。谢谢! android:drawable 属性接受颜色资源(例如@color/black),而不是在drawable 中使用形状。【参考方案2】:您可以使用接受颜色资源(例如@color/black)的android:drawable
属性,而不是在drawable 中使用形状。
layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myview"
android:orientation="horizontal"
android:layout_
android:layout_
android:gravity="top"
android:background="@drawable/myDrawable">
<!-- other views in layout-->
</LinearLayout>
my_drawable.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- focused -->
<item android:state_focused="true" android:drawable="@color/YOUR_COLOR_HERE" />
<!-- focused and pressed-->
<item android:state_focused="true" android:state_pressed="true" android:drawable="@color/YOUR_COLOR_HERE" />
<!-- pressed -->
<item android:state_pressed="true" android:drawable="@color/YOUR_COLOR_HERE" />
<!-- default -->
<item android:drawable="@color/YOUR_COLOR_HERE" />
</selector>
在my_drawable.xml
中,您需要确保您指定的颜色在res/values/colors.xml
中定义,否则这将不起作用。
如果您想使用图像而不是将颜色从颜色资源更改为可绘制资源。 示例:
android:drawable="@color/YOUR_COLOR_HERE"
android:drawable="@drawable/YOUR_IMAGE_HERE"
【讨论】:
这对我来说开箱即用不太好。我不得不将选择器项中的 android:drawable 更改为 android:color ,然后它就可以正常工作了。 非常感谢您,Austyn。 @emmby:我添加了关于“开箱即用”使用此代码需要做什么的说明。 完美运行。对于那些像我一样不熟悉 colors.xml 文件的人,请参阅***.com/questions/3769762/… 这可行,应该是公认的答案。看看这里goo.gl/QGRoCt以上是关于带有颜色资源的Android LinearLayout:我做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何从android资源colors.xml创建颜色枚举(int)
如何在带有深色主题的android上更改chrome中状态栏的颜色?