2011-08-07 104 views
10

开始的活动经过长时间的搜索后,我找不到任何合适的解决方案。 我有一个Android应用程序的几乎所有代码的Android库项目。从图书馆项目的主要活动中,我启动一个Intent以显式的活动A.在我使用库项目的派生项目中,我扩展了这个活动A并添加了一些新代码。问题是活动A的超类将会响应,而不是派生类。从Android-Library-Project

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

下面是从图书馆计划的意图电话:

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 

我不想做太多更改库项目beacuase一个第三个项目应该使用现有的代码与原始AndroidActivity

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

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

在此先感谢!

回答

0

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

 
activity android:name="de.app.library.activities.AndroidActivity" 

应该

 
activity android:name="de.app.free.activities.AndroidActivity" 

我的意思是,在AndroidActivity。在某种程度上,你正在从错误的包装中挑选错误的活动类别。

+2

在新项目中,我没有MainActivity类。我指向图书馆项目。只有AndroidActivity有一些变化,这就是为什么我已经扩展它。 – treimy

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将是您的派生活动(或另一个,您可以导入它们中的任何一个,因为您可以访问派生活动和库项目)。