12

经过长时间的搜索,我找不到任何合适的解决方案。我有一个 Android 库项目,其中包含几乎所有应用程序代码。从库项目的主要活动中,我启动了一个明确的活动 A 的意图。在使用库项目的派生项目中,我扩展了这个活动 A 并添加了一些新代码。问题是 Activity A 的超类将响应而不是派生类。

在使用库项目的新项目清单中,我已经用新包声明了新活动。

这是图书馆项目的 Intent 调用:

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

所有其他事情对我来说都很好。例如,从新项目中使用更改的布局。

我该如何处理这个问题?也许我声明的新项目中的清单发生了变化,应该调用新活动而不是超类?

提前致谢!

4

2 回答 2

1

当您在库项目中执行此操作时

 Intent i = new Intent(getApplicationContext(), AndroidActivity.class);

AndroidActivity指库项目的AndroidActivity:除非您将它们作为库包含,否则项目不知道其他外部项目。只需检查您的导入,您正在导入AndroidActivity,并指示 Android 运行它。

很明显,如果库项目必须了解派生项目,那将是一个糟糕的设计模式

一个简单的解决方案是覆盖派生项目上的活动启动,如下所示:

图书馆项目活动:

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() 时,它将执行被覆盖的函数(前提是启动活动扩展了库项目的活动并覆盖了该方法)。在重写的函数上下文中,AndroidActivity.class 将是您的派生活动(或另一个,您可以导入其中的任何一个,因为您可以访问派生活动和库项目的)。

于 2014-11-08T06:11:34.500 回答
0

在您的新项目中,您可以使用不同的名称,而不是 AndroidActivity。如果您不想这样做,清单文件中的第二个 AndroidActivity 的完全限定名称应该可以解决您的问题。您可能在某处弄乱了包裹。

活动 android:name="de.app.library.activities.AndroidActivity"

应该

活动 android:name="de.app.free.activities.AndroidActivity"

我的意思是,AndroidActivity。在某种程度上,您从错误的包中选择了错误的活动类。

于 2011-08-07T20:36:37.470 回答