我正在尝试使用自定义属性的引用从自定义控件的构造函数中获取布局中另一个控件的资源ID。
控件在运行时运行得很漂亮,但是在编辑器中它会抛出下面显示的异常。
这段代码是从SlideDrawer Android源代码中无耻地撕掉的,所以我知道它必须有效,而且我做错了。
自定义控件的构造函数包含此...
mHandleId = a.getResourceId(R.styleable.Panel_handle, 0);
if (mHandleId == 0) {
e = new IllegalArgumentException(a.getPositionDescription() +
": The handle attribute is required and must refer to a valid child.");
}
布局如下所示
<com.xenosoft.hunted.widgets.Panel
xmlns:app="http://schemas.android.com/apk/res/com.xenosoft.hunted"
android:id="@+id/message_panel"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
app:handle="@+id/message_panel_handle"
app:content="@+id/message_panel_content"
app:position="left"
>
<ImageView
android:id="@+id/message_panel_handle"
android:layout_width="50dp"
android:layout_height="fill_parent"
android:background="#FF0000">
</ImageView>
<LinearLayout
android:id="@+id/message_panel_content"
android:layout_width="200px"
android:layout_height="fill_parent"
android:background="#000000">
</LinearLayout>
</com.xenosoft.hunted.widgets.Panel>
答案 0 :(得分:0)
如果ID只能定义一次,则@+id/message_panel_handle
和@+id/message_panel_content
定义两次。参考如何使用RelativeLayout定位视图。它应该是:
<com.xenosoft.hunted.widgets.Panel
xmlns:app="http://schemas.android.com/apk/res/com.xenosoft.hunted"
android:id="@+id/message_panel"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
app:handle="@+id/message_panel_handle"
app:content="@+id/message_panel_content"
app:position="left"
>
<ImageView
android:id="@id/message_panel_handle"
android:layout_width="50dp"
android:layout_height="fill_parent"
android:background="#FF0000">
</ImageView>
<LinearLayout
android:id="@id/message_panel_content"
android:layout_width="200px"
android:layout_height="fill_parent"
android:background="#000000">
</LinearLayout>
</com.xenosoft.hunted.widgets.Panel>