2012-01-11 32 views
61

我需要创建一个扩展Activity,做一些常见的任务在我的应用程序的基类,并从它致以活动,在下面的表格:android如何创建我自己的Activity并将其扩展?

公共BaseActivity延伸活动{} ....

公共子活动延伸BaseActivity {...}

子活动我需要给值以一些变量和UI组件中BaseActivity定义,我可能需要根据一些标志值用于子活动定义不同的布局,还(在子活动)欲执行的AsyncTask这是在BaseActivity中定义的。

这可能吗?如果是的话,有没有可能有帮助的教程? 预先感谢您

回答

127

究竟是你想达到什么目的?除了一些变量或布局的一部分,有两个不同的活动与一个共同的用户界面?

在这种情况下,我建议具有基部抽象活性,和两个混凝土继承子类。您可以在基本活动中定义所有常见行为,并为差异设置抽象方法,然后在实际实现中重写。

例如,两个活动,不同的布局资源:

public abstract class BaseActivity extends Activity { 
    @Override 
    public void onCreate(bundle) { 
     super.onCreate(bundle); 
     setContentView(getLayoutResourceId()); 
    } 

    protected abstract int getLayoutResourceId(); 
} 

public class Activity1 extends BaseActivity { 
    @Override 
    public void onCreate(bundle) { 
     super.onCreate(bundle); 
     // do extra stuff on your resources, using findViewById on your layout_for_activity1 
    } 

    @Override 
    protected int getLayoutResourceId() { 
     return R.layout.layout_for_activity1; 
    } 
} 

你可以有更多的抽象方法,为每一位想要具体到你的子类。

这样做就是,在我看来,不是有一个具体子类,以一个具体的超好多了:这会导致很多问题,通常是难以调试。

+0

非常感谢你,这正是我所需要的。 – user173488 2012-01-11 15:09:34

+1

没问题P)记住我在StackOverflow编辑器中很快编写了代码,可能会出现语法错误 – Guillaume 2012-01-11 19:43:50

+0

谢谢,我接受了这个想法并将它应用于其他函数,要传递的数据以及BaseActivity中的AsyncTask,它工作得很好。 – user173488 2012-01-12 07:23:10

5

是的,你可以,你应该牢记的基本继承规则。您将继承内部AsyncTask活动和BaseActivity中定义的属性(如果您使其受到保护而不是私有)。从我现在看到的,我认为你应该让BaseActivity成为一个抽象类,因为只有subActivities的实例才会被真正使用。

你应该只启动并尝试它,它会来的工作比你想象的更容易。如果您偶然发现任何问题,请询问。

2

我已经找到了@ Guillaume的解决方案更简单的方法。设置ContentView只在您的BaseActivity一次,不设置它在扩展它的活动:

public abstract class BaseActivity extends Activity { 
    @Override 
    public void onCreate(bundle) { 
     super.onCreate(bundle); 
     setContentView(activity_main); 
    } 
} 

public class Activity1 extends BaseActivity { 
    @Override 
    public void onCreate(bundle) { 
     super.onCreate(bundle); 
     // setContentView(activity_activity1) // Do NOT call this. 
    } 
} 
+1

似乎合法,但我有一些担心,用户将被留下来只使用一个布局...如果我有3个共同的3差异活动的意见,但除了所有的布局是不同的,那么我想这个解决方案击败目的.... – Juni 2016-11-07 20:59:39

2

这个问题已经有了很好的答案。
我的答案是针对那些正在寻找一些实例的人。
以下是完整的工作 - >CODE

enter image description here
我们没有做什么新的东西,它就像任何其他的继承方案(您想在多个地方的一些常见的行为,但你要编写行为只有一次)。

优势: 它确实提供了更好的代码的可读性,可维护性和嗒嗒blah.But不是这些-ibility后,如果你的大脑运行像羚羊,他们不会不管你的。
我们是在继承的实权之后“CONTROL”。 (这也是现实生活中发生的事情。父母控制孩子:))。

在我的例子中,我有两个活动MainActivity和OtherActivity。 两种活动都有不同的布局,但我希望他们都以一些动画或一些欢迎消息开头。

我们的第一个任务是找出共同的行为。 here - >用动画开始活动。
我们已经找到了常见的“东西”,现在我们将在BaseClass中编写该行为(AnimationActivity)。
MainActivity和OtherActivity将继承AnimationActivity。

所以代码看起来像`

BaseActivity

AnimationActivity { 

    startAnimation() 
    { 
    .... 
    } 
} 

儿童活动

MainActivity extends AnimationActivity{ 

} 

OtherActivity extends AnimationActivity{ 

} 

这种设计方法提供了很多控制灵活性(改良力量)。

1)控制:保持动画方法中的onCreate() 当你决定,活动应与动画开始。 保持你的方法在onCreate(Bundle bundle)方法中。现在只需更改修饰符,您就可以控制子活动。
如果保留修饰符为
final:子活动将从父动画开始。
摘要:儿童活动将不得不给自己的动画。
无修饰符:通过覆盖动画方法,小孩活动可以拥有自己的动画,否则小孩将拥有父动画。

2)灵活性:不要让里面的onCreate动画()方法 你可以不守动画方法中的onCreate(捆绑包)提供儿童活动的灵活性。 现在活动可以灵活地拥有自己的动画或根本没有动画的父级动画或 。
希望它有帮助。
快乐学习。

`