如何将android的属性传递给我的复合视图

时间:2014-06-11 14:24:42

标签: android android-custom-view

我想创建一个Compound视图,它包含一个ImageView,一个TextView和一个EditText

我发现了this lovely tutorial如何做到这一点,我的复合视图看起来很棒

现在我要复制TextView具有的所有属性,EditText具有的所有属性以及ImageView的所有属性

这样我就可以在我的自定义视图中通过xml设置它们。

 <declare-styleable name="MyCustomView">
        <attr name="mcv_label" format="string" />
        <attr name="mcv_fieldText" format="string" />
        <attr name="mcv_fieldHint" format="string" />
        <attr name="mcv_label_id" format="reference" />
        <attr name="mcv_field_id" format="reference" />
    </declare-styleable>

我当然能够在xml中定义它们

关键是我想做什么

 <com.lenabru.myapp.widget.MyCustomView
        style="@style/tableRowStyle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        mcv:mcv_label_id="@+id/tvLabel"
        android:text="@string/someText" <=== this line 
          />

没有将所有属性别名化为mcv styable
有可能吗?

MyCustomView.java

public class MyCustomView extends TableRow{

private EditText editText;
private TextView label;
    private ImageView image;
private int labelId;
private int formFieldId;

public FormField(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
    initAttributes(context,attrs, 0);
}

public FormField(Context context) {
    super(context);
    initAttributes(context,null, 0);
}


private void initAttributes(Context context, AttributeSet attrs, int defStyle) {
    LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    inflater.inflate(R.layout.form_field, this,true);
    label = (TextView)findViewById(R.id.label);
    editText = (EditText)findViewById(R.id.editText);

    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FormField, defStyle, 0);

    if(a.hasValue(R.styleable.MyCustomView_mvc_label_id)) {
        labelId = a.getResourceId(R.styleable.FormField_ff_label_id, 0);
        if(labelId!=0) {
            label.setId(labelId);
        }
    }


    a.recycle();
}

}

0 个答案:

没有答案