我有图书馆项目 A 和子项目 B。B 的唯一区别是单个 Activity 需要有额外的代码(例如,用于广告)
我知道我可以将 A.Activity 复制到 B 并添加代码,但如果我更改 A 中的代码,它不会在 B 中,所以这不是一个选项。
我如何将 A.Activity 扩展到 B.Activity 并添加一些代码,同时将其保留在 list 中的位置(因此按下 B.Activity 1 中的按钮,我转到 B.Activity 2(扩展来自 A.Activity)
详细场景:
在项目 A 中,单击 FirstActivity 中的按钮时,我转到 SecondActivity。我想覆盖 SecondActivity,当在项目 B 中时,我单击 FirstActivity(与 A 中的 FirstActivity 相同)我转到 SecondActivity,它被覆盖/扩展。
最佳答案
在您的子项目/非 lib 项目中,创建一个新 Activity (我们称之为子 Activity ),它从 lib 项目(父项目)中的 Activity 扩展而来。然后覆盖您要修改的方法。
在子项目的 list 中,您需要添加子 Activity 并(我想)通过为其提供适当的 Intent 过滤器使其成为启动 Activity 。
如果它不是启动 Activity ,那么您可能还会遇到库项目中的 Intent 试图启动 Activity 的标准(非覆盖)版本的问题。在使用一种“动态” Intent 系统之前,我已经克服了这个问题,而不是对 Intent 的类类型进行硬编码,而是从返回类型的 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;
}}
然后在您的子项目中,扩展您的 Activity 并执行自定义工作。但也覆盖库项目中的应用程序对象并覆盖您的方法,但返回您覆盖的 Activity 类类型:
public class OveriddenApp extends MyApp {
@Override
public Class getIntentClassType() {
return MyOveriddenActivity.class;
}}
像这样从图书馆项目扩展 Activity 有点笨拙,但从长远来看,它确实允许更清晰的代码分离,所以我认为这一点编码开销是值得的。
我很想知道是否有更优雅的方式来做到这一点...
关于android - 正确扩展/覆盖库 Activity ,在新项目中有效地替换它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17403431/