Android基于子元素值设置父元素的样式规则

时间:2014-12-02 03:42:56

标签: android android-layout

给定这个名为relLayoutWrap.xml的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/priorityView"
        android:layout_width="50dip"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/statusCheckBox"
        android:layout_alignParentRight="true"
        android:layout_alignTop="@+id/StatusLabel" >
   </TextView>
</RelativeLayout>

我想根据TextView元素的值为相对布局父元素应用不同的背景颜色。

当我对视图进行充气/回收时,textview元素的值可能会发生变化。即:

LayoutInflater inflater = (LayoutInflater) mContext.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
RelativeLayout itemLayout = (RelativeLayout) inflater.inflate(R.layout.relLayoutWrap,null);
final TextView priorityView = (TextView) itemLayout.findViewById(R.id.priorityView);

priorityView.setText("yes");  //or sometimes "no"

所以基本上如果TextView的值为“是”,我希望RelativeLayouts背景颜色为黄色,如果“no”,我希望背景颜色为蓝色。这纯粹是通过xml样式规则实现的吗?或者我必须手动设置背景颜色,因为此值会以编程方式更改?

1 个答案:

答案 0 :(得分:1)

老实说,最好的方法是自己设置颜色。

据我所知,没有办法用XML来做这件事,因为有条件地检查文本然后根据文本更改颜色。你可能有两个不同的按钮XML,并以这种方式去做,但这里似乎并不需要。

在我的代码中,我有类似的东西,除了我有更多的东西要改变而不仅仅是颜色。对我来说,我这样做......

public static final int STATUS_CODE_YES = 1;
public static final int STATUS_CODE_NO = 2;

. . . 

if(something something something) {
    //I need to set the state to Yes!
    updateTextView(STATUS_CODE_YES);
} else {
    //I need to set the state to no...
    updateTextView(STATUS_CODE_NO);
}

. . . 


public void updateTextView(int status) {
switch(status) {
    case STATUS_CODE_YES:
        textView.setText("Yes");
        textView.setBackground(Color.YELLOW);
        //a lot more stuff here
        break;
    case STATUS_CODE_NO: 
        textView.setText("No");
        textView.setBackground(Color.BLUE);
        //a lot more stuff here
        break; 
    default:
        System.out.println("You did something wrong here...ERROR");
        break;
}

这个系统对我很有用。从技术上讲,我想有可能通过XML实现这一目标,但它们并不适用于这种情况。