3

我有图书馆项目 A 和子项目 B。 B 的唯一区别是单个活动需要有额外的代码(例如,用于广告)

我知道我可以将 A.Activity 复制到 B 并添加代码,但是如果我更改 A 中的代码,它将不在 B 中,所以这不是一个选项。

如何将 A.Activity 扩展到 B.Activity 并添加一些代码,同时将其保留在清单中的位置(因此在 B.Activity 1 中按下一个按钮,我转到 B.Activity 2(它从 A.Activity 扩展)。活动)

详细场景:

在项目 A 中,当单击 FirstActivity 中的按钮时,我转到 SecondActivity。我想覆盖 SecondActivity,当在项目 B 中时,我单击 FirstActivity(与 A 中的相同)我转到 SecondActivity,它已被覆盖/扩展。

4

2 回答 2

2

在您的子/非 lib 项目中,创建一个从 lib 项目(父)中的活动扩展的新活动(我们称之为子活动)。然后覆盖您要修改的方法。

在子项目的清单中,您将需要添加子活动并(我假设)通过为其提供适当的意图过滤器使其成为启动活动。

如果它不是启动活动,那么您可能还会遇到库项目中试图启动活动的标准(非覆盖)版本的意图问题。在使用一种“动态”意图系统之前,我已经克服了这个问题,我不是硬编码意图的类类型,而是从返回类型的 Application 对象中获取它。

例如

在图书馆项目中:

public class MainActivity extends Activity {

private void launchOverideableActivity(){

    MyApp app = (MyApp) getApplication();
    Intent i = new Intent(this, app.getIntentClassType());
    startActivity(i);
}}

并覆盖应用程序对象,以便您可以提供此动态类类型:

public class MyApp extends Application {

public Class getIntentClassType(){
    return MainActivity.class;
}}

然后在您的子项目中,扩展您的活动并进行自定义工作。但也覆盖库项目中的应用程序对象并覆盖您的方法,但返回您覆盖的活动类类型:

public class OveriddenApp extends MyApp {

@Override
public Class getIntentClassType() {
    return MyOveriddenActivity.class;
}}

像这样从库项目中扩展活动有点笨拙,但从长远来看,它确实允许更清晰的代码分离,所以在我看来,这一点编码开销是值得的。

我很想知道是否有更优雅的方式来做到这一点......

于 2013-07-01T12:01:44.627 回答
1

我发现从库项目中扩展活动类很麻烦,并最终导致大型项目出现问题。也许我做错了!

相反,我将所有必需的功能放入库项目并使用配置资源(例如布尔标志)来确定是否启用此功能。

默认配置在库项目中,然后我只是在子项目的 xml 中覆盖它。

于 2013-07-01T12:07:12.477 回答