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

时间:2012-01-11 14:48:53

标签: android android-activity extends custom-activity

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

public BaseActivity扩展了活动{....}

public SubActivity扩展了BaseActivity {...}

SubActivity 中的

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

这可能吗?如果是的话,是否有任何可能有帮助的教程? 提前谢谢你

4 个答案:

答案 0 :(得分:135)

你到底想要达到什么目的?除了一些变量或布局的一部分之外,还有两个不同的活动和一个普通的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 :(得分:5)

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

你应该开始尝试它,它会比你想象的更容易。如果你遇到任何问题,请问问。

答案 2 :(得分:5)

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

enter image description here
我们在这里没有做任何新的事情,它就像任何其他继承场景一样(你想在多个地方有一些常见的行为,但你只想写一次这种行为)。

<强> ADVANTAGE: 它确实提供了更好的代码可读性,可维护性和等等。但是,如果你的大脑像瞪羚一样奔跑,那么它们对你来说并不重要 我们追求真正的继承权力“CONTROL”。 (这就是现实生活中发生的事情。父母控制孩子:))。

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

我们的首要任务是找出共同的行为。 这里 - &gt;用动画启动活动 我们找到了常见的“东西”,现在我们将在BaseClass中编写该行为( AnimationActivity )。
MainActivity 和OtherActivity将继承AnimationActivity。

所以代码看起来像`

  

BaseActivity

AnimationActivity {

  startAnimation()
  {  
    ....  
  } 
}
  

儿童活动

MainActivity extends AnimationActivity{

}

OtherActivity extends AnimationActivity{

}

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

1)CONTROL:将动画方法保留在onCreate()中 当您决定应使用动画启动活动时。 将您的方法保存在onCreate(Bundle bundle)方法中。现在只需更改修改器,即可控制子活动 如果你将修饰符保持为
final:子活动将以父动画开始 摘要:儿童活动必须提供自己的动画 no modifier:子活动可以通过覆盖动画方法拥有自己的动画,否则孩子将拥有父动画。

2)灵活性:不要将动画方法保留在onCreate()中 您可以通过不将动画方法保留在onCreate(Bundle bundle)中来提供子活动的灵活性。 现在,活动可以灵活地拥有父动画或他们自己的动画或根本没有动画 希望它有所帮助。
快乐学习。

`

答案 3 :(得分: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.
    }
}