在使用库项目的新项目的清单中,我已使用新包声明了新活动。
以下是来自图书馆计划的意图调用:
Intent i = new Intent(getApplicationContext(), AndroidActivity.class);
startActivity(i);
以下是派生的AndroidActivity类:
public class AndroidActivity extends de.app.library.activities.AndroidActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
我无法进入onCreate方法
图书馆计划的清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.app.library"
android:versionName="1.0"
android:versionCode="1">
<uses-sdk android:minSdkVersion="4" />
<application
android:icon="@drawable/icon"
android:label="@string/app_name">
<activity android:name=".activities.MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".activities.AndroidActivity" android:label="@string/act_android" />
</application>
这里是新项目的清单:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.app.free"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="4" />
<application
android:icon="@drawable/icon"
android:label="@string/app_name">
<activity android:name="de.app.library.activities.MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".activities.LernenActivity" android:label="@string/act_lernen" />
所以我有:
de.app.library.activities.AndroidActivity and
de.app.free.activities.AndroidActivity
我不想对库项目进行那么多更改,因为第三个项目应该使用现有代码和未触及的AndroidActivity
ALl其他的东西对我来说很好。例如,从新项目中使用更改的布局。
我该如何处理这个问题?也许我在宣布的新项目中更改了Manifest,应该调用新活动而不是超类?
提前致谢!
答案 0 :(得分:1)
在库项目中执行此操作时
Intent i = new Intent(getApplicationContext(), AndroidActivity.class);
AndroidActivity
指的是图书馆项目的AndroidActivity
:除非您将其作为图书馆包含在内,否则项目不了解其他外部项目。只需检查您的导入,即可导入AndroidActivity
,并指示Android运行它。
顺便说一下,如果图书馆项目必须知道衍生项目,这将是一个糟糕的设计模式
一个简单的解决方案是覆盖派生项目上的活动启动,如下所示:
Libary项目活动:
public void runMyActivity() {
Intent i = new Intent(getApplicationContext(), AndroidActivity.class);
// You are on the library project, so you can refer to the activities created in it.
// the only AndroidActivity known here is the library project's
.
.
}
您的衍生项目的活动:
@Override
public void runMyActivity() {
// You are now on the derived project, so you can refer to
// the activities created in it, and also to the library project's. You
// just import the package name of the desired activity or use fully qualified
// names
Intent i1 = new Intent(getApplicationContext(), AndroidActivity.class);
// this one will use the activity in the imports
Intent i2 = new Intent(getApplicationContext(), de.app.libarary.AndroidActivity.class);
// use the activity from the library project
Intent i3 = new Intent(getApplicationContext(), de.app.free.AndroidActivity.class);
// use the activity from the derived project
.
.
}
因此,当您从任何地方调用runMyActivity()时,它将执行overriden函数(前提是启动活动扩展了库项目的活动并覆盖了该方法)。在覆盖函数上下文中,AndroidActivity.class将是您的派生活动(或者另一个,您可以导入它们中的任何一个,因为在这里您可以访问派生的活动和库项目)。
答案 1 :(得分:0)
在新项目中,您可以使用其他名称,而不是AndroidActivity。如果您不想这样做,清单文件中的第二个AndroidActivity的完全限定名称应该可以解决您的问题。你可能在某个地方搞砸了一些包。
activity android:name="de.app.library.activities.AndroidActivity"
应该是
activity android:name="de.app.free.activities.AndroidActivity"
我的意思是AndroidActivity。在某种程度上,你从错误的包中挑选了错误的活动类。