如何为扩展布局定义AttributeSet参数

时间:2014-11-01 06:33:26

标签: android

我无法理解如何在代码中实例化自定义布局。具体来说,我不知道如何定义所需的AttributeSet参数。

我已经阅读了官方文档,但无法绕过它:

http://developer.android.com/training/custom-views/create-view.html http://developer.android.com/reference/android/util/AttributeSet.html

在我的活动中,我用:

实例化它
new MyCustomLayout(getActivity(), attrs)

但我该如何定义attrs

MyCustomLayout.java

public class MyCustomLayout extends LinearLayout implements
        OnClickListener {

    ...
    ...

    public MyCustomLayout(Context context, AttributeSet attrs) {

        super(context, attrs);
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.mycustomxmllayout, this, true);
        ...
    }

    ...
}

mycustomxmllayout.xml

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" >

    <TextView 
        android:id="@+id/txt_1"
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:layout_weight="2" 
        android:lines="1"/>

    <Button 
        android:id="@+id/btn_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minHeight="0dp"
        android:minWidth="0dp"
        android:background="@null"
        android:text="x"
        android:layout_weight="1"
        />

</merge>

1 个答案:

答案 0 :(得分:1)

首先,您应该在res/values/attrs.xml中定义自定义属性,只需添加<declare-styleable>,例如:

   <declare-styleable name="MyCustomLayout">
       <attr name="showText" format="boolean" />
       <attr name="buttonPosition" format="enum">
           <enum name="left" value="0"/>
           <enum name="right" value="1"/>
       </attr>
   </declare-styleable> 

现在您可以通过xml设置自定义attrs,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:custom="http://schemas.android.com/apk/res-auto">
 <your.package.name.MyCustomLayout
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     custom:showText="true"
     custom:buttonPosition="left" />
</LinearLayout>

在你的构造函数中,你可以抓住那些:

public MyCustomLayout(Context context, AttributeSet attrs) {
   super(context, attrs);
   TypedArray a = context.getTheme().obtainStyledAttributes(
        attrs,
        R.styleable.MyCustomLayout,
        0, 0);

   try {
       mShowText = a.getBoolean(R.styleable.MyCustomLayout_showText, false);
       mButtonPos = a.getInteger(R.styleable.MyCustomLayout_buttonPosition, 0);
   } finally {
       a.recycle();
   }
}

如果要以编程方式设置attrs,则应为此创建公共getter / setter:

private boolean mShowText;
private Integer mButtonPos;

public void setButtonPos(int pos) {
    mButtonPos = pos;
}

public void setShowText(boolean showText) {
    mShowText = showText;
}

之后,您可以通过编程方式设置您的attrs:

MyCustomLayout layout = new MyCustomLayout(getActivity());
layout.setButtonPos(0);
layout.setShowText(true);