问题描述
|
我有一个Android库项目,我想在另一个Android项目中使用。
该库在其AndroidManifest中声明了一个Activity。当我在第二个项目中尝试以下操作时:
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)
...
如何从另一个项目中打开活动?
编辑:
根据用户的回答,我在第二个项目中添加了以下内容
<uses-library android:name=\"br.com.digitalpages.reader\" android:required=\"true\" />
但这仍然行不通
解决方法
我相信您必须在自己的AndroidManifest.xml中包含 -我不认为它是从库中获取的。我没有方便的参考资料。
更新:这是官方解决方案。从文档中:
在清单文件中声明库组件
在应用程序项目的清单文件中,您必须添加
应用程序将使用的所有组件的声明是
从库项目导入。例如,您必须声明任何
<activity>
,<service>
,<receiver>
,<provider>
等,以及
<permission>
,<uses-library>
和类似的元素。
声明应按其库组件引用
适当情况下的标准软件包名称。
, Intent intent = new Intent(android.content.Intent.ACTION_VIEW);
intent.setComponent(new ComponentName(\"packagename//ex-com.hello\",\"classname//ex-com.hello.ExampleActivity\"));
startActivity(intent);
并确保已在库中声明了活动。您无需在当前项目的清单中声明库活动。
, 您添加到清单了吗?
http://developer.android.com/guide/topics/manifest/uses-library-element.html
, 这有效:
在您的书架中,添加自定义Activity
:
public class MyLibraryActivity extends ListActivity { ... }
无需将其放入清单中。
在调用的Android项目中,创建一个空的(虚拟)包装器:
public class MyActivity extends MyLibraryActivity { }
并将对此类的引用添加到清单中:
<activity android:name=\"my_package.MyActivity\" ... />
, 我知道这个问题已经很久了,但是我认为这可能会帮助像我这样遇到同样问题的人。
使用Eclipse,在库之间共享代码和活动的最好方法可能是在android文档中找到的一种方法:
使用ADT从Eclipse管理项目
, 您应该只导入活动的代码(而不是清单),然后在第二个项目的清单中声明您的Activity(属于库)。
, 如果您已经在启动库的活动时通过使用以下代码在库的清单中添加了活动,则无需在主项目的清单中显式添加活动。
对于科特林
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);