2つのAndroidプロジェクト、カスタムレイアウトを含む「ライブラリプロジェクト」、およびレイアウトを使用するアプリケーションを含む「アプリケーションプロジェクト」があります。
ビジュアルレイアウトエディターがClassNotFoundException(プラグインのバグだと思います)をスローすることを除いて、すべてが正常にビルドおよび実行されているようですが、カスタムレイアウト用に定義した属性を使用し始めようとするとxml、私はもう構築できません。あれは;これは機能します:
<?xml version="1.0" encoding="utf-8"?>
<se.fnord.Android.layout.PredicateLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent">
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="asdfasdf"
/>
</se.fnord.Android.layout.PredicateLayout>
これはしませんが:
<?xml version="1.0" encoding="utf-8"?>
<se.fnord.Android.layout.PredicateLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:fnord="http://schemas.Android.com/apk/res/se.fnord.Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent">
<TextView
fnord:layout_horizontalSpacing="1px"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="asdfasdf"
/>
</se.fnord.Android.layout.PredicateLayout>
ビルドはaaptからのメッセージで失敗します:
エラーパッケージ「se.fnord.Android」の属性「layout_horizontalSpacing」のリソース識別子が見つかりません
リソース識別子はRファイルに存在し、attrs.xmlにはライブラリプロジェクトが含まれています。レイアウトコードとリソースをアプリケーションプロジェクトに直接配置すると、すべて正常に機能します。 layout_horizontalSpacing属性(およびlayout_verticalSpacing)は、次のウィジェットまでの距離を指定するためにPredicateLayout.LayoutParamクラスで使用されるカスタム属性です。
これまで、プロジェクト参照とビルドパスプロジェクトの依存関係を指定することにより、標準のEclipseの方法を試しました。また、アプリケーションマニフェストでタグを試すように言われましたが、役に立ちませんでした。
では、xmlファイルの参照を機能させるには何をする必要がありますか?
関連性があるかどうかはわかりませんが、「ライブラリ」マニフェストは次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="se.fnord.Android"
Android:versionCode="1" Android:versionName="1.0.0">
</manifest>
'アプリケーション'マニフェストは次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="se.fnord.appname"
Android:versionCode="1" Android:versionName="1.0.0">
<application Android:icon="@drawable/icon" Android:label="@string/app_name">
<activity Android:name=".AppName"
Android:label="@string/app_name">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
( 'PredicateLayout'、ところで、 this のクリーンアップバージョンです)。
初期のバージョンのAndroid sdkは、ソースコードレベルでの共有をうまくサポートしていませんでした。classファイルをjarファイルにして、それをlib /フォルダーに追加することもできますが、このソリューションはソースコードの直接共有を許可せず、同様に重要なことに、リソースまたは援助ファイルの共有をサポートしていませんでした。
その後、2010年5月にAndroidライブラリプロジェクトメカニズムが導入されました。ライブラリプロジェクトは、通常のAndroidプロジェクトと非常によく似ていますが、作成に使用されるのではありませんapkは、他のプロジェクトにコードとリソースを提供するためだけに機能します。通常のプロジェクトと同様に、ライブラリプロジェクトには通常、AndroidManifest.xmlファイルとともにsrcフォルダーとresフォルダーが含まれますが、マニフェストはほとんど空である必要があります。マニフェスト要素とパッケージ属性(trueではなくなりました。ライブラリプロジェクトのマニフェストでアクティビティやその他のコンポーネントを宣言できるようになりました)。さらに、ライブラリプロジェクトのproject.propertiesファイルには次のプロパティが含まれている必要があります。
"Android.library=true"
通常の(apk生成)プロジェクトからライブラリプロジェクトへの参照を作成するには、通常のプロジェクトのproject.propertiesファイルに「Android.library.reference.N」行を追加する必要があります。たとえば、メインプロジェクトが2つのライブラリプロジェクトをポイントする場合、メインプロジェクトのproject.propertiesファイルには次のものが含まれます。
Android.library.reference.1=../LibraryA
Android.library.reference.2=../../LibraryB
ここで、.. /と../../は、メインプロジェクトからライブラリプロジェクトへのそれぞれのパスです(これは単なる例です)。この参照リストは1ベースであり、ギャップや重複が含まれていてはならないことに注意してください。 Googleはこれが完璧なシステムではないことをよく知っていますが、AntおよびEclipseと互換性のある合理的なソリューションでした。一般的に、IDEはこれらのファイルを維持しようとしますが、手動で編集する必要がある場合もあります。
当初、LibraryProjectsは以下をサポートしていませんでした。
ただし、後続のSDKリリースでは、これらの問題がすべて解決されました。
ライブラリプロジェクトの詳細については、 公式ドキュメント を参照してください。
プロジェクトをJARとしてエクスポートすることは、[プロパティ]-> Javaビルドパス-> [ライブラリ]]を使用してライブラリプロジェクトをアプリプロジェクトにリンクする正しい方法ではありません。必要に応じてプロジェクトをリンクすることもできません。プロパティ-> Javaビルドパス->プロジェクトを介してプロジェクト。
まず、ライブラリプロジェクトのトピックをAndroid開発者->開発->プロジェクトの管理: http://developer.Android.com/guide/developing/projects/index)で読んでください。 .html#LibraryProjects この後、Android開発者->開発->プロジェクトの管理-> Eclipse With ADTから)でライブラリプロジェクトの設定とライブラリプロジェクトのトピックの参照を再度読んでください。
だから...手順は次のとおりです。
この後、すべてのクラス、コンポーネント(アクティビティ、サービス、プロバイダー、レシーバー)、リソースなどを使用できます。
例:xmlレイアウト内のリソースを参照するには、たとえば、@ mylib:id/my_idまたは@mylib:layout/my_lib_layoutを使用する必要があります
Obs。:アプリプロジェクトでライブラリのコンポーネントを使用する場合は、アプリマニフェストでそれらを複製する必要があります。
また、属性は機能しましたが、機能するはずの方法ではないと思います。
カスタム属性を使用する要素の名前空間として、ライブラリプロジェクトの名前空間ではなく、メインアプリの名前空間を使用する必要があります。したがって、この例では、「xmlns:fnord」の値にアプリプロジェクトの名前空間を指定すると、機能します。
また、カスタムPredicateLayout(Context,AttributeSet)
コンストラクターでカスタム属性を読み取るときは、attributes.getAttributeValue()
の呼び出しでもアプリの名前空間を指定する必要があります。
そのコードは、使用されているアプリプロジェクトを認識していない、または認識していないライブラリアプリにあるため、これは面倒です。アプリで静的メソッドViewUtil.setAttributeNamespace(appNamespace)を呼び出すことで回避しました。私のアプリのonCreate()とライブラリのカスタムビューは、その名前空間を使用してカスタム属性を取得します。その後、attrs.xmlファイルをライブラリプロジェクトに残すこともできます。唯一の醜い点は、レイアウトXMLがカスタムビューでアプリの名前空間を使用する必要があるため、それらのレイアウトXMLをライブラリプロジェクトに配置できないことです。
ライブラリプロジェクトをJARとしてエクスポートし、アプリケーションプロジェクトの「Javaビルドパス」でJARとして参照します。
「ライブラリをjarとしてエクスポートする」ソリューションは、ライブラリプロジェクトにソースコードのみが含まれている場合にのみ機能します。この場合、OPの質問には、ライブラリプロジェクトにui関連のものが含まれていることが記載されています。
私のチームには、UI関連のソースとリソースを保持するライブラリプロジェクトが必要であるというまったく同じ問題があります。ビルド時にアプリケーションがライブラリプロジェクトを飲み込むようにするために、Antビルドシステムをオーバーホールすることになりました。残念ながら、この種のソリューションはEclipseと互換性がないようであり、これは開発者にとって大きなフラストレーションの原因です。 Eclipseは引き続き使用できますが、Eclipseを機能させるには、フープを飛び越えて、生産性の低下に耐えなければなりません。