【问题标题】:Starting Activity from Android-Library-Project从 Android-Library-Project 启动 Activity
【发布时间】:2011-10-21 22:15:57
【问题描述】:

经过长时间的搜索,我找不到任何合适的解决方案。 我有一个包含几乎所有应用程序代码的 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

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

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

提前致谢!

【问题讨论】:

    标签: android android-activity android-intent library-project


    【解决方案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 将是您的派生活动(或另一个,您可以导入其中的任何一个,因为在这里您可以访问派生活动和库项目的)。

    【讨论】:

      【解决方案2】:

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

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

      应该是

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

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

      【讨论】:

      • 在新项目中我没有 MainActivity 类。我指的是图书馆项目。只有 AndroidActivity 有一些变化,这就是我扩展它的原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      相关资源
      最近更新 更多