自定义视图与布局
好,
我想要做的是在默认的布局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 );