自定义视图与布局

好,

我想要做的是在默认的布局main.xml中embedded一个自定义视图:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <com.lam.customview.CustomDisplayView android:id="@+id/custom_display_view1" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:id="@+id/prev" android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="50" android:textAppearance="?android:attr/textAppearanceSmall" android:text="@string/prev" /> </LinearLayout> </LinearLayout> 

你可以看到这个类叫做com.lam.customview.CustomDisplayView,其id为custom_display_view1。

现在在com.lam.customview.CustomDisplayView类,我想使用另一个名为custom_display_view.xml的布局,因为我不想以编程方式创build控件/小部件。

custom_display_view.xml只是一个button和一个图像,我想根据一定的条件改变其内容:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/display_text_view1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <ImageView android:id="@+id/display_image_view1" android:layout_width="wrap_content" android:layout_height="wrap_content"> </ImageView> </LinearLayout> 

我试图做到:

1)

 public CustomDisplayView(Context context, AttributeSet attrs) { super(context, attrs); try { // register our interest in hearing about changes to our surface SurfaceHolder holder = getHolder(); holder.addCallback(this); View.inflate(context, R.layout.custom_display_view, null); 

但得到这个错误,“03-08 20:33:15.711:错误/ onCreate(10879):二进制XML文件行#8:错误膨胀类java.lang.reflect.Constructor”。

2)

 public CustomDisplayView(Context context, AttributeSet attrs) { super(context, attrs); try { // register our interest in hearing about changes to our surface SurfaceHolder holder = getHolder(); holder.addCallback(this); View.inflate(context, R.id.custom_display_view1, null); 

但得到这个错误,“03-08 20:28:47.401:错误/ CustomDisplayView(10806):资源ID#0x7f050002types#0x12无效”

另外,如果我这样做,正如有人build议,我不清楚custom_display_view.xml如何与自定义视图类相关联。

谢谢。

我有完全相同的问题,问题是我使用了错误的ID …它看起来就像你一样。

你应该参考

R.layout.custom_display_view

-不-

R.id.custom_display_view

您可以通过以下方式将cutom_display_view膨胀到您的自定义类中:

 public CustomDisplayView(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if(inflater != null){ inflater.inflate(R.layout.custom_display_view, this); } } 

这个博客文章帮助我明白了要做什么http://trickyandroid.com/protip-inflating-layout-for-your-custom-view/ 。 如果博客文章消失,下面是代码的一些部分:

 public class Card extends RelativeLayout { public Card(Context context) { super(context); init(); } public Card(Context context, AttributeSet attrs) { super(context, attrs); init(); } public Card(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } private void init() { inflate(getContext(), R.layout.card, this); } } 

与这个布局:

 <?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="@dimen/card_padding" android:background="@color/card_background"> <ImageView ... /> <TextView ... /> </merge> 

该控件包含如下内容:

 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin"> <com.trickyandroid.customview.app.view.Card android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@color/card_background" android:padding="@dimen/card_padding"/> </FrameLayout> 

com.trickyandroid.customview.app.view是类卡的命名空间。 有一件事对我来说是新的,就是“合并”标签,它最终与包含文档中的卡片标签是同一个节点。

当你膨胀你的布局时,你应该传入一个对视图实例的引用来将其标识为根。 所以不要打电话:

 View.inflate(context, R.layout.custom_display_view, null); 

呼叫:

 View.inflate(context, R.layout.custom_display_view, this); 

请参阅: 文档

第8行是您在第一个布局中的自定义视图。 你试图加载错误的布局,所以它试图加载自己recursion? (我只是做了同样的事情)

你也有:

  R.layout.custom_display_view 

  R.id.custom_display_view1 

1结束那里…哪一个呢?

尝试使用

 context.getLayoutInflater().inflate( R.id.custom_display_view1, null );