9

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

Card.java :(我有View.inflate(context, R.layout.card_layout, null);一个我想做的例子,但它不起作用。我基本上希望该类成为视图的接口,为了做到这一点,我需要以某种方式分配 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>
4

2 回答 2

9

当前设置无法执行您尝试执行的操作。A View(或它的直接子类)代表一个单一的视图,它没有子视图的概念,你正在尝试做什么。LayoutInflater不能与 simple 一起使用,因为ViewsimpleView类没有实际添加子类的方法(如addView()方法)。

另一方面,能够生孩子的正确类是ViewGroup(或直接子类之一,如LinearLayout等) ,通过提供方法FrameLayout接受添加Views或其他。最后你的课应该是:ViewGroupsaddView

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替换LinearLayout来自 xml 布局的。merge

于 2012-08-25T05:39:45.673 回答
3

您应该能够在布局中使用您的类名。就像是:

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

只需致电findViewById以获取孩子的意见。

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

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

查看文档以获取更多信息。

于 2012-08-24T22:39:47.993 回答