我创建了一个抽象类来防止我的每个活动中出现冗余代码。
public abstract class MyGeneralizedActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
@Override
public void attachBaseContext(Context newBase) {
super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
//...
}
这样做我很好:
public class MyActivity extends MyGeneralizedActivity{...}
但是现在我必须从MyActivity
扩展FragmentActivity
。这意味着我不能再从MyGeneralizedActivity
延伸。
现在我想知道是否有可能建立一个通用的抽象结构来扩展我的所有活动。
修改
只需从MyGeneralizedActivity
延长FragmentActivity
即可解决我的问题。例如TabActivity
会导致同样的问题。
更新
对于那些可能有兴趣在Android中解决同样问题的人,我找到了一个简单的解决方法。存在Application类,除其他外,还提供接口ActivityLifecycleCallbacks。它完全符合我的需要,允许我们拦截并为所有活动的重要事件添加一些价值。
您所要做的就是扩展Android Application
类,并创建一个实现ActivityLifecycleCallbacks
的私有类。
不要忘记在AndroidManifests
文件中添加/重命名您的应用程序:
<application
android:name=".application.MyApplication"
//...
/>
答案 0 :(得分:1)
由于FragmentActivity
和MyGeneralizedActivity
都是类而不是接口,因此无法创建属于两者的子类型的类型。
Java限制您使用单一继承,因此如果您依赖于分享两个类中包含的实现,那么您最好的选择就是依赖于组合。
例如:
public class MyActivity extends Activity {
FragmentActivity fragmentActivity;
MyGeneralizedActivity myGeneralizedActivity;
public MyActivity(FragmentActivity fragmentActivity, MyGeneralizedActivity myGeneralizedActivity) {
this.fragmentActivity = fragmentActivity;
this.myGeneralizedActivity = myGeneralizedActivity;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
this.fragmentActivity.onCreate(savedInstanceState);
this.myGeneralizedActivity.onCreate(savedInstanceState);
//...
}
@Overridepublic void attachBaseContext(Context newBase) {
this.fragmentActivity.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
this.myGeneralizedActivity.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
//...
}
}
答案 1 :(得分:1)
这似乎是Decorator Pattern的一个问题。
您希望在运行时向各个对象添加行为或状态。继承是不可行的,因为它是静态的并且适用于整个类。
特别考虑你的情况,因为Android API没有为Activity定义一个界面,我们可以跳过一些官僚主义,只是以(不是那么)快速和肮脏的方式来做:
abstract public class ActivityDecorator extends Activity {
protected Activity original;
public MyAcitvityDecorator(Activity original) {
this.original = original;
}
protected void onCreate(Bundle savedInstanceState) {
this.original.onCreate(savedInstanceState);
}
/* ... Because there is no better way of doing it in Java, you should do
* this for every method in the Activity class: delegate the execution of
* the method to the original activity object.
* Yes, there is A LOT of methods!
}
然后你必须创建一个具体的装饰器并覆盖到期方法:
class MyActivityDecorator extends ActivityDecorator {
@Override
protected void onCreate(Bundle savedInstanceState)
{
this.original.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
@Override
public void attachBaseContext(Context newBase) {
this.original.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}
}
然后你可以像这样使用它:
Activity myActivity = new MyActivityDecorator(new Activity());
由于MyAcitvityDecorator
是Activity
的一个实例,因此您可以无缝地传递它。
您甚至可以链接装饰器并更改原始Activity
对象,如下所示:
Activity myActivity = new MyActivityDecorator(
new AnotherActivityDecorator(
new TabActivity()
)
);
答案 2 :(得分:0)
见FragmentActivity source code。 FragmentActivity
扩展Activity
课程。我想你应该试试看。
祝你好运。
答案 3 :(得分:0)
如果使用Java 8,您可以使用默认方法创建接口。然后,您可以通过这种方式实现多个接口并获得所需的结果。
详情请参阅:Interface with default methods vs Abstract class in Java 8