使用XML布局作为View子类的视图?

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

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> 

Related of "使用XML布局作为View子类的视图?"

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

另一方面,能够拥有子ViewGroup的正确的类是ViewGroup (或者像LinearLayoutFrameLayout等直接子类),通过提供addView方法接受添加Views或其他ViewGroups 。 最后你的课应该是:

 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并从merge标签的XML布局replaceLinearLayout

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

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

只要调用findViewById来获取子视图。

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

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

看看有关更多信息的文档。