如何正确扩展LinearLayout以创建自定义视图

时间:2014-07-11 12:10:41

标签: android android-layout android-fragments android-linearlayout android-context

我有一些“卡片”,这是一个简单的LinearLayout,里面有一个TextView

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
>
 <TextView
        android:id="@+id/card_label_txt"
        android:layout_width="wrap_content"
        android:text="label" />
</LinearLayout>

然后我的主片段有一个垂直的LinearLayout ..在这个主片段中我将这个“卡片”添加到主布局中:

# main fragment layout
View view = inflater.inflate(R.layout.main_activity, null);
LinearLayout ll = (LinearLayout) view
                .findViewById(R.id.main_activity_ll);
# get card
View card = inflater.inflate(R.layout.card, null);

# add to fragment layout
ll.addView(card);

这非常好用我的卡填充片段布局的整个宽度。实际上是我所期待的。

现在我为我的卡创建了一个单独的类:

Class Card extends LinearLayout{

public Card(Context context) {
        super(context);

        View view =  LayoutInflater.from(getContext()).inflate(
                R.layout.card, null);

        this.addView(view);

    }
}

然后,如果我将卡片添加到主片段布局中:

# main fragment layout
View view = inflater.inflate(R.layout.main_activity, null);
LinearLayout ll = (LinearLayout) view
                .findViewById(R.id.main_activity_ll);

# add new Card to fragment layout
ll.addView(new Card(getActivity());

然后它被添加但是卡的宽度不再填充,而是包裹在textview中。

有人可以通过这两种添加相同布局的方法向我解释为什么我会得到不同的宽度尺寸吗?

解决方案此处已更改解决此问题的Card类:

public Card(Context context) {
       super(context);

       LayoutInflater.from(getContext()).inflate(
                R.layout.card, this);
    }
}

1 个答案:

答案 0 :(得分:16)

这不是实现自定义View类的正确方法。在您实现Card类时,您实际上是在创建一个不需要的额外LinearLayout。

首先,实现扩展LinearLayout的Card类。然后,在XML布局中引用它,如:

<com.mypackagename.Card xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card="http://schemas.android.com/apk/res-auto"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >
 <TextView
        android:id="@+id/card_label_txt"
        android:layout_width="wrap_content"
        android:text="label" />
</com.mypackagename.Card>

Here's a good tutorial on creating custom views in android.