android如何创建自己的Activity并进行扩展?


68

我需要创建一个扩展的基类,该基类可以Activity在应用程序中执行一些常见任务,并通过以下形式扩展我的活动

公共BaseActivity扩展了活动{....}

公共SubActivity扩展了BaseActivity {...}

SubActivity中,我需要给在BaseActivity中定义的一些变量和UI组件赋值,我可能需要根据一些标志值为SubActivity定义不同的布局,也(在SubActivity中)我想执行在BaseActivity中定义的asyncTask

这可能吗?如果是,是否有任何教程可以帮助您?先感谢您

Answers:


138

您到底想达到什么目的?除了某些变量或布局的某些部分外,是否有两个具有共同ui的不同活动?

在这种情况下,我建议您有一个基本的抽象活动,以及两个具体的继承子类。您可以在基本活动中定义所有常见行为,并具有区别的抽象方法,然后在实际实现中将其覆盖。

例如,对于具有不同布局资源的两个活动:

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;
    }
}

对于想要特定于子类的每一点,您可以拥有更多抽象方法。

在我看来,这样做要比拥有具体的子类到具体的超类好得多:这可能会导致很多问题,并且通常很难调试。


1
没问题P)请记住,我在StackOverflow编辑器中快速编码,可能会出现语法错误
Guillaume12年

谢谢,我接受了这个想法并将其应用于其他功能,要传递的数据和BaseActivity中的AsyncTask,它工作得很好。
user173488 2012年

3
是的,我的项目的基础活动中还有很多东西。实际上,我通常花一些时间来考虑是否应该将其放入基础活动或(自定义)应用程序中。如果与布局有关,则与活动有关,如果与布局无关,则与应用有关。
纪尧姆

问题:请您分享一个我可以使用的方案。
Tushar Pandey 2014年

由于它是抽象的,因此无需添加基础活动即可显示,并且您无需实例化它。
Ojonugwa Jude Ochalifu 2015年

6

这个问题已经有了很好的答案。
然而。我的答案是针对那些正在寻找工作示例的人。
这是完整的工作-> 代码

在此处输入图片说明
我们在这里没有做任何新的事情,就像任何其他继承方案一样(您希望在多个地方有一些共同的行为,但只想编写一次该行为)。

优势: 它的确提供了更好的代码可读性,可维护性和等等。但是不是这些能力,如果您的大脑像瞪羚一样运转,它们对您来说就没有关系。
我们追求继承“ CONTROL”的真正力量。(这也是现实生活中发生的事情。父母控制孩子:))。

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

我们的首要任务是找出常见行为。在这里->从动画开始活动。
我们已经找到了常见的“事物”,现在我们将该行为写在BaseClass(AnimationActivity)中。
MainActivity和OtherActivity将继承AnimationActivity。

因此代码看起来像是`

基础活动

AnimationActivity {

  startAnimation()
  {  
    ....  
  } 
}

儿童活动

MainActivity extends AnimationActivity{

}

OtherActivity extends AnimationActivity{

}

这种设计方法提供了很多控制灵活性(POWER OF MODIFIER)。

1)控制:当您决定应该以动画开始活动时,将动画方法保留在onCreate()中。将您的方法保留在onCreate(Bundle bundle)方法中。现在,只需更改修改器,就可以控制子活动。
如果将修饰符保留为
final:子级活动将从父级Animation开始。
摘要:儿童活动将不得不赋予自己的动画。
no修饰符:子活动可以通过覆盖动画方法来拥有自己的动画,否则,子活动将具有父动画。

2)灵活性:不要将动画方法保留在onCreate()中,可以通过不将动画方法保留在onCreate(Bundle bundle)中来提供子活动灵活性。现在,活动可以灵活地具有父级动画或自己的动画,也可以根本没有动画。
希望能帮助到你。
学习愉快。

`


5

是的,您可以,您应该牢记基本的继承规则。如果您将内部AsyncTask活动和属性定义为私有属性而不是私有属性,则将继承它们。从我现在看到的情况来看,我认为您应该使BaseActivity成为一个抽象类,因为仅会真正使用subActivities的实例。

您应该开始尝试,它会比您想象的要容易得多。如果您发现任何问题,请问。


3

我已经找到一种更简单的方法来@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.
    }
}

4
似乎合法,但我有些担心,用户将只能使用一种布局...如果我在3个差异活动中共有3个视图,但除所有布局不同外,我猜想此解决方案将无法达到目的。 ..
Junaid
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.