膨胀扩展Layoutclass的复合组件的问题

时间:2011-08-10 19:45:49

标签: android components composite

这是我的第一个问题,据我所知,如果我可能错过了一个已被回答的类似问题,请与我同行。

我的问题: 我正在尝试扩展LinearLayout以用作复合组件。我已经按照本教程: link

这似乎相当直接。但是,当我尝试给组件充气时,它会一直失败, 我从logCat得到的错误是找不到我的类。我觉得奇怪的是,只要我能看到android在我自己的组件中搜索我的组件(我不确定这里的正确措辞,请参见下文)。

我写的代码如下:

main(当前活动):

//just the ordinary autogenerated eclipse code...
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}

我的扩展线性布局:

public class DialPadView extends LinearLayout {

public DialPadView(Context ctx, AttributeSet attr) {
    super(ctx, attr);
}


@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    ((Activity)getContext()).getLayoutInflater().inflate(R.layout.dialpadview, this);
}

}

我的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"
>
<whalenut.testinflate.DialPadView
    android:id="@+id/mydialpad"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    /></LinearLayout>

最后我的dialpadview.xml文件用于我的复合组件:

<?xml version="1.0" encoding="utf-8"?>
<DialPadView
   xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent">
   <EditText 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="test"/>
</DialPadView>

当然我的所有类文件都在 whalenut.testinflate

包中

logCat说:

java.lang.RuntimeException:无法启动活动ComponentInfo {whalenut.testinflate / whalenut.testinflate.TestInflateActivity}:android.view.InflateException:二进制XML文件行#2:错误膨胀类DialPadView

...

引起:android.view.InflateException:二进制XML文件行#2:错误膨胀类DialPadView

...

引起:java.lang.ClassNotFoundException:loader dalvik.system.PathClassLoader中的android.view.DialPadView [/data/app/whalenut.testinflate-2.apk]

如果我们能帮助我理解Dalvik(?)为什么在 android.view 中搜索我的课程而不是 whalenut.testinflate xml文件中的完全限定的类名,是因为它找不到我的开头吗?

我希望在我的猜测中我已经足够清楚了。简而言之,为什么我不能,或者更确切地说如何在android中扩展一个扩展的布局?

1 个答案:

答案 0 :(得分:1)

您需要按如下方式更改DialPadView:

<merge android:class="com.packageName.UIClassName"
    android:id="@+id/DialView"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
<EditText android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="test"/>
</merge>

然后在构造函数中调用它:

super(context, attrs, defStyle);

LayoutInflater inflater = (LayoutInflater) context
    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

inflater.inflate(R.layout.DialView, this, true);

然后,您可以在主要活动中使用以下内容:

DialView myDialView = new DialView(context);

mainView.addView(myDialView);

我希望这有帮助!