确定,
我想要做的是在默认布局main.xml中嵌入自定义视图:
<?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的布局,因为我不想以编程方式创建控件/窗口小部件。
custom_display_view.xml只是一个按钮和一个图像,我希望根据特定条件更改其内容:
<?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:ERROR / 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:ERROR / CustomDisplayView(10806):资源ID#0x7f050002类型#0x12无效 “
另外,如果我这样做,正如有人建议的那样,我不清楚custom_display_view.xml如何与自定义视图类相关联。
感谢。
答案 0 :(得分:70)
我遇到了完全相同的问题,问题是我使用了错误的ID ......而且看起来就像你一样。
你应该引用
<强> R.layout.custom_display_view
强>
- 不是 -
<强> R.id.custom_display_view
强>
答案 1 :(得分:8)
这篇博客文章帮助我了解了该做些什么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是类卡的命名空间。对我来说有一件事是&#34;合并&#34;标记,最终与包含文档中的Card标记相同的节点。
答案 2 :(得分:7)
您可以通过以下方式将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);
}
}
答案 3 :(得分:4)
当您对布局进行膨胀时,应该传入对视图实例的引用以将其标识为根。所以不要打电话:
View.inflate(context, R.layout.custom_display_view, null);
呼叫:
View.inflate(context, R.layout.custom_display_view, this);
请参阅:The docs
答案 4 :(得分:0)
尝试使用
context.getLayoutInflater().inflate( R.id.custom_display_view1, null );
答案 5 :(得分:0)
第8行是第一个布局中的自定义视图。你是否试图加载错误的布局,所以它试图递归加载自己? (我只是做了同样的事情)
你也有:
R.layout.custom_display_view
VS
R.id.custom_display_view1
结尾有 1 ......那是哪一个?