自定义ViewGroup时直接继承已知布局,节省代码

本文介绍了一种自定义CardView的方法,通过继承LinearLayout并利用LayoutInflater加载布局文件,实现了灵活的卡片视图组件。同时,文章还展示了如何使用DataBinding简化属性绑定。
摘要由CSDN通过智能技术生成

以前因为年少无知,以为自定义ViewGroup时一定要自己安排其中子View的布局,幻想着要是能直接继承某个布局从而不用自己再安排子View的布局该有多好,今天无意间看了一段源码之后,才知道这原来不是梦!!!#-#

自定义的Card

public class Card extends LinearLayout {

    private TextView mFirstName;
    private TextView mLastName;
    private TextView mAge;

    public Card(Context context) {
        this(context, null);
    }

    public Card(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public Card(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        inflate(context, R.layout.card, this);
        setOrientation(VERTICAL);

        //因为Data binding 不支持直接包含 merge 节点,所以这里只能通过findViewById
        mFirstName = (TextView) findViewById(R.id.firstname);
        mLastName = (TextView) findViewById(R.id.lastname);
        mAge = (TextView) findViewById(R.id.age);
    }

    // 自动 Setter
    public void setObject(User user) {
        mFirstName.setText(user.getFirstName());
        mLastName.setText(user.getLastName());
        mAge.setText(String.valueOf(user.getAge()));
    }
}

对应的card布局:

<merge
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/firstname"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/lastname"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/age"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</merge>

当然这里还涉及到了Data Binding使得内容,顺便提一下(Data Binding 在对应名称的属性不存在的时候也能继续工作。你可以轻而易举地使用 Data Binding 为任何 setter “创建” 属性。):

<路径名.Card
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       app:object="@{user}"/>

上述自定义布局 Card,并没有添加 declare-styleable,但是可以使用自动 setter 的特性来调用这些函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值