使用XML Layout作为View Subclass的视图?

时间:2012-08-24 22:14:02

标签: android android-layout android-view

我觉得好像我曾经知道如何做到这一点,但我现在正在画一个空白。我有一个从View(Card)扩展的类,我用XML为它编写了一个布局。我想要做的是将Card的视图设置为构造函数中的XML视图,这样我就可以使用Card中的方法来设置TextView和诸如此类的东西。有什么建议?代码如下:

Card.java: (我有View.inflate(context, R.layout.card_layout, null);作为我想要做的一个例子,但它不起作用。我基本上希望该类成为View的接口,为了做到这一点,我需要以某种方式分配XML视图的布局。我是否使用了setContentView(View view)的内容?View类中没有这样的方法,但有类似的东西吗?)

public class Card extends View {

    TextView tv;

    public Card(Context context) {
        super(context);
        View.inflate(context, R.layout.card_layout, null);
        tv = (TextView) findViewById(R.id.tv);
    }

    public Card(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        View.inflate(context, R.layout.card_layout, null);
        tv = (TextView) findViewById(R.id.tv);
    }

    public Card(Context context, AttributeSet attrs) {
        super(context, attrs);
        View.inflate(context, R.layout.card_layout, null);
        tv = (TextView) findViewById(R.id.tv);
    }

    public void setText(String text) {
        tv.setText(text);
    }

}

card_layout.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="336dp"
    android:layout_height="280dp"
    android:layout_gravity="center"
    android:background="@drawable/card_bg"
    android:orientation="vertical" >


    <TextView
        android:id="@+id/tv"
        android:layout_height="fill_parent"
        android:layout_width="wrap_content"
        android:textSize="24dp"
    />

</LinearLayout>

2 个答案:

答案 0 :(得分:10)

目前的设置无法实现您的目标。 View(或其直接子类)代表单个视图,它没有子视图的概念,您正在尝试做什么。 LayoutInflater不能与简单View一起使用,因为简单的View类没有实际添加子项的方法(如addView()方法)。

另一方面,能够生孩子的正确类是ViewGroup(或其中一个直接子类,如LinearLayoutFrameLayout等),它们接受添加通过提供Views方法,ViewGroups或其他addView。最后你的班级应该是:

public class Card extends ViewGroup {

    TextView tv;

    public Card(Context context) {
        super(context);
        View.inflate(context, R.layout.card_layout, this);
        tv = (TextView) findViewById(R.id.tv);
    }

    public Card(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        View.inflate(context, R.layout.card_layout, this);
        tv = (TextView) findViewById(R.id.tv);
    }

    public Card(Context context, AttributeSet attrs) {
        super(context, attrs);
        View.inflate(context, R.layout.card_layout, this);
        tv = (TextView) findViewById(R.id.tv);
    }

    public void setText(String text) {
        tv.setText(text);
    }

}

如果我记得你扩展onLayout时必须覆盖ViewGroup,那么(因为你的布局文件),你应该考虑扩展LinearLayout并替换{{ 1}}来自带有LinearLayout标记的xml布局。

答案 1 :(得分:3)

您应该可以在布局中使用您的班级名称。类似的东西:

<your.package.name.Card 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="336dp"
    android:layout_height="280dp"
    ...

只需致电findViewById即可获得子视图。

要使用您的Card类,您可以使用充气器来获取实例,然后将其附加到父视图。

LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
Card card = (Card) inflater.inflate(R.layout.card_layout, null);
parentView.addView(card);

Have a look at the docs for more info.