69

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

公共 BaseActivity 扩展 Activity{....}

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

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

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

4

4 回答 4

138

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

在这种情况下,我建议有一个基本的抽象活动和两个具体的继承子类。您在基本活动中定义所有常见行为,并为差异提供抽象方法,然后在实际实现中覆盖这些方法。

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

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

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

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

于 2012-01-11T15:02:09.163 回答
8
于 2017-07-05T16:50:39.270 回答
5

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

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

于 2012-01-11T14:54:46.293 回答
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.
    }
}
于 2016-02-17T13:51:20.173 回答