16

私はLibraryプロジェクトをセットアップし、このライブラリプロジェクトに依存するプロジェクトを持っています-すべてが正常にコンパイルされ、Dependentプロジェクトは正常に実行されました。

Libraryただし、プロジェクトのアクティビティを使用しているときに断続的な問題が発生します。

私のLibraryプロジェクトはライブラリ プロジェクトとして「チェックを外す」ことができ、「ピッカー」アクティビティは分離して実行できます。プロジェクトを単独で実行しLibraryても問題なく動作します。

Library依存プロジェクトからプロジェクト (および「ピッカー」アクティビティ)を使用するNullPointerExceptionsと、「ピッカー」アクティビティがリソースを見つけられないというエラー (または歴史的に DexOp) が表示されます。

以前にこれを経験したことがあるかどうか、誰か教えてもらえますか?

編集

layout.xmlプロジェクト アクティビティで使用されるを依存プロジェクトに手動でコピーするLibraryと、プロジェクトは「ピッカー」アクティビティを正しく開きます。これは必須ですか?!きっとそうではありませんか?R.javaこれにより、Libraryプロジェクト内の整数IDのマージ/参照に問題があるかどうか疑問に思います。

編集

これが何らかの結果をもたらすかどうかはわかりませんが、私のLibraryプロジェクトの 1 つは、さまざまなフロント エンド プロジェクトで使用される一連のカスタム ビューのラッパーです。

これらのカスタム ビューにはそれぞれアクティビティがあり、個別にテストできます。

これらのビューの 1 つにはカスタム属性があり、単独で実行している間は非常にうまく機能します。ただし、依存プロジェクトが属性を正しくプルして元の名前空間に保持しているようには見えないため、インポートされたレイアウトでコンパイル エラーがスローされます。

[2012-05-16 12:07:28 - Project] D:\opt\workspace\CustomGlowList\res\layout\main.xml:14: error: No resource identifier found for attribute 'listId' in package 'com.company.library.glowlist'
[2012-05-16 12:07:28 - Project] D:\opt\workspace\CustomGlowList\res\layout\main.xml:14: error: No resource identifier found for attribute 'type' in package 'com.company.library.glowlist

編集

プロジェクトに存在する重複したファイル名を削除することで、DexOp エラーが解決されましたDependent。ファイル名が問題なのか、ファイルの内容なのかはわかりません。

編集

私はまだこの問題の解決策を見つけることができませんでした(ただし、@ yorkwの回答は確かにxml属性に役立ちます!ありがとう)。

ただし、この問題を断続的にすることができました:

各ライブラリ プロジェクトを確認し、すべてに独自の名前空間 (など) があることcom.company.library.component1を確認しましたcom.company.library.component2。いくつかのクリーンアップ (正しい優先順位で順序付けされた各プロジェクト) の後、この問題は自然に解決しますが、コンポーネントをテストするためにライブラリ/ライブラリではなく切り替えると、最終的に戻ってきます。

4

5 に答える 5

14

原因:

問題9656:ライブラリプロジェクトはカスタムクラスのカスタムXML属性をサポートしていません

解決:

最新のSDKおよびADTバージョン(r17以降にリリースされた修正済み)にアップグレードしhttp://schemas.android.com/apk/res-auto、カスタム属性の名前空間URIとして使用します。ADT17.0.0のリビジョンを参照してください。

ライブラリ内のカスタム属性を持つカスタムビューのサポートが追加されました。カスタム属性を使用するレイアウトでは、アプリパッケージ名を含むURIではなく、名前空間URIhttp : //schemas.android.com/apk/res-autoを使用する必要があります。このURIは、ビルド時にアプリ固有のURIに置き換えられます。

関連トピック:

Androidライブラリプロジェクト内のカスタムビュー属性のヘルプ

于 2012-05-16T22:10:25.037 に答える
2

アンドロイドライブラリの使い方はわかりませんが、私はこれを何度も問題なく行ってきたので、アンドロイドライブラリの使用に関する次のことを読んでください。

  1. AndroidプロジェクトでAndroidライブラリプロジェクトを使用するには、「project.properties」を編集してそこにライブラリプロジェクトへのパスを追加するか、はるかに簡単に、プロジェクトを右クリックします(ライブラリプロジェクトを使用します)。 「android」カテゴリを選択し、そこに「追加」を選択して、ライブラリプロジェクトを選択します。

  2. アンドロイドプロジェクトが常にアンドロイドライブラリプロジェクトを開くようにするには、「javaビルドパス」->「プロジェクト」を選択し、ライブラリプロジェクトを選択します。

  3. 「project.properties」で、このAndroidバージョンでアプリをテストできない場合でも、両方のプロジェクトで同じターゲットにターゲットを設定し、最新のターゲット(現在は15)にターゲットを設定してみてください。

  4. ソースファイルとすべてのリソースファイル(resフォルダー内)は、ライブラリプロジェクトで使用できます。

  5. アセットフォルダは、ライブラリプロジェクト内では使用できません。実際に実行されているAndroidプロジェクトでのみ、assetsフォルダーを使用できます。同じことがproguardファイルにも当てはまります。

  6. ライブラリプロジェクトのマニフェストには、ほとんど何も必要ありません。詳細については、この投稿を参照してください:https ://stackoverflow.com/a/10445630/878126 。ライブラリプロジェクトに、それを使用するプロジェクトを介してアクセスできるようにしたいアクティビティがある場合は、それらをAndroidプロジェクトのマニフェストに含めることを忘れないでください(Androidライブラリのマニフェストに書き込む必要はありません)。 )。

  7. アプリをエクスポートする前に、lintを実行することを忘れないでください。たくさんの警告が表示されますが、最も重要な警告は、ターゲットとするAPIの範囲で実行できない新しい関数を使用する場合です。複数のソースがあると迷子になりやすいので、これはライブラリにとって重要です。

  8. androidライブラリでアクティビティを拡張したい場合は、それらの間を移動するための何らかのメソッドが必要です。私が知っている唯一の方法は、アプリケーションを拡張し、各アクティビティのインテントを作成する方法のマネージャーにすることです。私はあなたが他のトリックをすることができると思います、しかしそれらはすべておそらくこれに似ています。

  9. androidライブラリとandroidプロジェクトの両方に同じリソース(「res」フォルダー上の任意のリソース)がある場合、androidプロジェクトの一方が他方を置き換えます。これには長所と短所があります。同じリソースに対して異なるファイル拡張子を持つことはできないことに注意してください。

于 2012-05-16T20:25:00.680 に答える
1

私は同じ問題を抱えています.1つのライブラリプロジェクトがあり、いくつかのアクティビティがあります. メイン プロジェクトからライブラリ プロジェクトのアクティビティを呼び出していたときに、レイアウト ファイル リソースがライブラリ プロジェクトのアクティビティに対して適切にロードされず、「nullpointer 例外」または「クラスをロードできませんでした」などが発生しました。

解決策: ライブラリ プロジェクトとメイン プロジェクトで同じレイアウト ファイル名が使用されていることに気付きました。これらのアクティビティの名前を変更したところ、解決しました。

これはあなたを助けるかもしれません。

于 2012-11-22T12:50:13.520 に答える
0

Android アプリ プロジェクト内で Library プロジェクトを参照すると、同様の問題が発生しました。Library プロジェクトから R.java ファイルを削除したので、再度生成され、App は生成されたファイルを取得しました。アプリ project->gen->library_namespace_R.java の下に、生成された R.java ファイルが表示されます。

于 2013-09-23T20:06:33.583 に答える