delete from hateblo.jp where 1=1;

タイトルに意味はありません。

Android のライブラリでカスタムフォームを使っている場合のtips

概要

対象
  • カスタムフォームを使用している
  • Eclipse でカスタムフォームでエラーにぶち当たっている
    • ClassNotFoundException が発生している
    • android.content.res.Resources$NotFoundException が発生している
要因
  • layoutのxmlにて、xmlns定義を間違えている
  • xmlnsはリソースの存在する場所を指定する
    • ライブラリの場合、リソースは、親プロジェクト(apkを最終的に作成するプロジェクト)へ統合されるため、指定先は親プロジェクトとなる

サンプル

問題のあるコード
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:validate="http://schemas.android.com/apk/res/com.andreabaccega.formedittext"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

<ScrollView
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >
<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <com.andreabaccega.widget.FormEditText
        style="@android:style/Widget.EditText"
        android:id="@+id/editName"
        android:inputType="text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="@string/menu_setting_edit_name"
        android:singleLine="true"
        validate:testType="nocheck" >
        <requestFocus />
    </com.andreabaccega.widget.FormEditText>

</LinearLayout>
</ScrollView>
</LinearLayout>
問題のログ
Error Sun Oct 28 01:09:22 JST 2012
com.andreabaccega.widget.FormEditText failed to instantiate.

android.content.res.Resources$NotFoundException: Could not resolve resource value: 0x7F050004.
at com.android.layoutlib.bridge.android.BridgeResources.throwException(BridgeResources.java:648)
at com.android.layoutlib.bridge.android.BridgeResources.getString(BridgeResources.java:461)
at android.content.Context.getString(Context.java:182)
at com.andreabaccega.widget.FormEditText.(FormEditText.java:143)
at com.andreabaccega.widget.FormEditText.(FormEditText.java:72)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback.instantiateClass(ProjectCallback.java:402)
at com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback.loadView(ProjectCallback.java:166)
at com.android.layoutlib.bridge.android.BridgeInflater.loadCustomView(BridgeInflater.java:205)
at com.android.layoutlib.bridge.android.BridgeInflater.createViewFromTag(BridgeInflater.java:133)
(以下略)
修正箇所
xmlns:validate="http://schemas.android.com/apk/res/com.andreabaccega.formedittext"
↓
xmlns:validate="http://schemas.android.com/apk/res-auto"

※ com.andreabaccega.formedittext はカスタムフォームのパッケージ名(外部Androidライブラリ)