【问题标题】:Can an Android <selector> be based on an object's state instead of a view's state?Android <selector> 可以基于对象的状态而不是视图的状态吗?
【发布时间】:2010-08-05 04:42:11
【问题描述】:

我认为这是一个非常简单的问题,但我很难找到答案......

我正在开发一个 android 应用程序(目前针对 v1.5 API 进行开发),其中一个活动使用 ListView。我希望能够根据内存中对象的状态而不是视图或列表项的状态来设置每个列表项的属性。

这是一个简单的例子....假设我有一个 Person 类,其公共成员定义如下:

public class Person {       
    public string getName() {...}

    public boolean isYoung() {...}        
    public boolean isMiddleAged() {...}
    public boolean isOld() {...}
}

就像上面概述的示例一样,我的类中的属性是互斥的(因此三个布尔值中只有 一个 可能为真)。现在说我的 ListView 中的每个 List Item 都是从 Person 对象创建的。我目前正在使用自定义 ArrayAdapter 类将 Person 对象绑定到列表视图(不确定这是否重要,但我想我会提到它)。

我希望能够根据绑定在列表视图中的每个 Person 对象的值设置各种列表项属性(文本颜色和样式以及背景颜色)。比如可能把所有年轻人的背景颜色都设为绿色,中年人的背景颜色为橙色,老年人的背景颜色为黑色。我怎样才能达到这些结果?

更新:感谢您的快速回复 Cristian C。我一直在尝试实施您的解决方案并不断收到此异常:

原因:org.xmlpull.v1.XmlPullParserException:二进制 XML 文件第 6 行:&lt;item> 标记需要 'drawable' 属性或定义可绘制对象的子标记

...每次 setBackgroundResource() 执行时:

public View getView(int index, View convertView, ViewGroup parent) {
    //...stuff here...

   if(person.isYoung())
      view.setBackgroundResource(R.drawable.green);
}

其中选择器“green.xml”的定义如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:background="@color/green" />
</selector>

您是否发现我正在尝试做的事情有任何明显的错误?

感谢您的回复!

【问题讨论】:

    标签: android listview css-selectors


    【解决方案1】:

    您必须以编程方式进行。假设您已经在一个 XML 文件中定义了所有这些选择器;那么你会有这样的东西:

    private class YourAdapter extends ArrayAdapter<Person>{
        // foo bar baz
        //...
    
        public View getView(int position, View convertView, ViewGroup parent){
    
            // more foo bar baz
    
            if( person.isYoung() )
                view.setBackgroundResource(R.drawable.green);
            else if( person.isMiddledAge() )
                view.setBackgroundResource(R.drawable.orange);
            else if( person.isOld() )
                view.setBackgroundResource(R.drawable.black);// are you racist?  Just kidding
    
            return view;
        }
    }
    

    你可以这样定义你的选择器:

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

    绿色可以是名为green.png 的可绘制文件夹中的图像。您也可以使用在colors.xml 文件(values 目录)中定义的纯色来实现:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <color name="orange">#FF5721</color>
    </resources>
    

    那么,你会这样做:

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

    【讨论】:

    • 感谢克里斯蒂安的回复...请看我的更新。再次感谢!
    • 完美!!再次感谢您的帮助 =)
    猜你喜欢
    • 2014-03-21
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多