web-dev-qa-db-ja.com

別のプロジェクト内でAndroidライブラリプロジェクトアクティビティを使用する

Androidライブラリプロジェクトを別のAndroidプロジェクトから使用したい。

ライブラリには、AndroidManifestで宣言されたアクティビティがあります。 2番目のプロジェクト内で次のことを試してみると:

        Intent intent = new Intent(this, ReaderActivity.class);
        startActivity(intent);

次の例外が発生します。

 Java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.digitalpages.reader.demo/br.com.digitalpages.reader.demo.ReaderDemoActivity}: Android.content.ActivityNotFoundException: Unable to find explicit activity class {br.com.digitalpages.reader.demo/br.com.digitalpages.reader.ReaderActivity}; have you declared this activity in your AndroidManifest.xml?
     at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2663)
...
 Caused by: Android.content.ActivityNotFoundException: Unable to find explicit activity class {br.com.digitalpages.reader.demo/br.com.digitalpages.reader.ReaderActivity}; have you declared this activity in your AndroidManifest.xml?
     at Android.app.Instrumentation.checkStartActivityResult(Instrumentation.Java:1404)
     at Android.app.Instrumentation.execStartActivity(Instrumentation.Java:1378)
...

別のプロジェクトからアクティビティを開くにはどうすればよいですか?

編集:ユーザーの回答によって、私は2番目のプロジェクトに次の行を追加しました

<uses-library Android:name="br.com.digitalpages.reader" Android:required="true" />

しかし、それはまだ動作しません

38

<activity>を独自のAndroidManifest.xmlに含める必要があると思います-ライブラリから取得されるとは思わない。私はその便利なものに対する参照を持っていません。

更新:これは公式の解決策です。 ドキュメント から:

マニフェストファイルでのライブラリコンポーネントの宣言

アプリケーションプロジェクトのマニフェストファイルで、ライブラリプロジェクトからインポートされる、アプリケーションが使用するすべてのコンポーネントの宣言を追加する必要があります。たとえば、<activity><service><receiver><provider>など、および<permission><uses-library>、および同様の要素。

宣言では、必要に応じて、完全修飾パッケージ名でライブラリコンポーネントを参照する必要があります。

36
mah
Intent intent = new Intent(Android.content.Intent.ACTION_VIEW);
intent.setComponent(new ComponentName("packagename//ex-com.hello", 
                                     "classname//ex-com.hello.ExampleActivity"));
startActivity(intent);

そして、ライブラリでアクティビティを宣言していることを確認してください。現在のプロジェクトのマニフェストでライブラリアクティビティを宣言する必要はありません。

19
sheetal

これは動作します:

ライブラリに、カスタムActivityを配置します。

public class MyLibraryActivity extends ListActivity { ... }

マニフェストに入れる必要はありません。呼び出し元のAndroidプロジェクトで、空の(ダミー)ラッパーを作成します。

public class MyActivity extends MyLibraryActivity { } 

このクラスへの参照をマニフェストに追加します。

<activity Android:name="my_package.MyActivity" ... />
4
barnabas
4
Aleadam

アクティビティのコード(マニフェストでもない)のみをインポートしてから、2番目のプロジェクトのマニフェストで(ライブラリの)アクティビティを宣言する必要があります。

1
Houcine

私は質問がかなり古いことを知っていますが、これは同じ問題を思いついた私のような人々を助けるかもしれないと思います。

Eclipseを使用して、ライブラリ間でコードとアクティビティを共有する最良の方法は、おそらくAndroidドキュメント:

ADTを使用したEclipseからのプロジェクトの管理

1
qwlice

ライブラリのアクティビティを開始するときに次のコードを使用してライブラリのマニフェストに既にアクティビティを追加している場合、メインプロジェクトのマニフェストにアクティビティを明示的に追加する必要はありません。

コトリンの場合

   val myIntent = Intent(activityContext, ActivityToLaunch::class.Java)
    // Needed to set component to remove explicit activity entry in application's manifest
    myIntent.component = ComponentName(activityContext, PickerActivity::class.Java)
    activityContext.startActivity(myIntent, PICKER_REQUEST_CODE)

Javaの場合

    Intent myIntent = new Intent(activityContext, PickerActivity.class);
    // Needed to set component to remove explicit activity entry in application's manifest
    final ComponentName component = new ComponentName(activityContext, PickerActivity.class);
    myIntent.setComponent(component);
    activityContext.startActivity(myIntent, REQUEST_CODE);
0
minhazur