通过定义BaseActivity来实现项目中代码重用,重写setContentView实现多个Activity部分UI布局相同
2015-05-08 19:23
435 查看
安卓应用中不同的activity一般都具有相同的地方,最典型的是标题栏(titlebar),我们只需在每个activity中调用setTitle就可以得到一个除了标题文字不同,其他完全相同的标题栏。
系统已经为我们引进了titlebar这样的功能,但是如果我们还需要一个类似titlebar这样容易copy外形的bottombar呢?
当然是否需要一个bottombar是个问题,我要说的其实是如果我们想让activity共享一部分UI的情况下该怎么做。
很直观的我们会写一个activity的子类,然后将公共部分的UI在这个子类activity中实现,命名为BaseActivity,最后所有要共享此部分UI的activity都继承这个BaseActivity。
思路是这样,但是究竟该如何写这个BaseActivity呢,注意上面蓝色那句话,公共部分的UI如果是通过setContentView来渲染的话那该如果处理BaseActivity子类中其独有的UI呢,合理的情况是在BaseActivity子类中调用setContentView来显示自己独有的界面,但是两次调用setContentView总有一次是会被覆盖的。
现在的情况是,我们想得到公共的UI,但没办法把公共部分和独有部分的UI分开来处理。解决问题的办法是了解activity的布局到底是如何组成的,setContentView做了些什么。
![](http://www.jcodecraeer.com/uploads/20140331/36821396279829.png)
一、DecorView为整个Window界面的最顶层View。
二、DecorView只有一个子元素为LinearLayout。代表整个Window界面,包含通知栏,标题栏,内容显示栏三块区域。
三、LinearLayout里有两个FrameLayout子元素。
(20)为标题栏显示界面。只有一个TextView显示应用的名称。也可以自定义标题栏,载入后的自定义标题栏View将加入FrameLayout中。
(21)为内容栏显示界面。就是setContentView()方法载入的布局界面,加入其中。
所以要实现activity具有公共部分的UI,重写setContentView()方法:
作为新的内容区域。
接下来将公共部分的UI添加进新的内容区域。
我这里是自定义了一个标题栏作为公共部分,其实如果是标题栏可以不如此麻烦直接用原生的titlebar就行了。
然后重写setContentView,将子类的内容区域从原本该直接挂在到
系统已经为我们引进了titlebar这样的功能,但是如果我们还需要一个类似titlebar这样容易copy外形的bottombar呢?
当然是否需要一个bottombar是个问题,我要说的其实是如果我们想让activity共享一部分UI的情况下该怎么做。
很直观的我们会写一个activity的子类,然后将公共部分的UI在这个子类activity中实现,命名为BaseActivity,最后所有要共享此部分UI的activity都继承这个BaseActivity。
思路是这样,但是究竟该如何写这个BaseActivity呢,注意上面蓝色那句话,公共部分的UI如果是通过setContentView来渲染的话那该如果处理BaseActivity子类中其独有的UI呢,合理的情况是在BaseActivity子类中调用setContentView来显示自己独有的界面,但是两次调用setContentView总有一次是会被覆盖的。
现在的情况是,我们想得到公共的UI,但没办法把公共部分和独有部分的UI分开来处理。解决问题的办法是了解activity的布局到底是如何组成的,setContentView做了些什么。
![](http://www.jcodecraeer.com/uploads/20140331/36821396279829.png)
一、DecorView为整个Window界面的最顶层View。
二、DecorView只有一个子元素为LinearLayout。代表整个Window界面,包含通知栏,标题栏,内容显示栏三块区域。
三、LinearLayout里有两个FrameLayout子元素。
(20)为标题栏显示界面。只有一个TextView显示应用的名称。也可以自定义标题栏,载入后的自定义标题栏View将加入FrameLayout中。
(21)为内容栏显示界面。就是setContentView()方法载入的布局界面,加入其中。
所以要实现activity具有公共部分的UI,重写setContentView()方法:
(ViewGroup) findViewById(android.R.id.content)可以获得挂在一个activity内容部分LinearLayout。在这个LinearLayout中添加一个LinearLayout
接下来将公共部分的UI添加进新的内容区域。
然后重写setContentView,将子类的内容区域从原本该直接挂在到
android.R.id.content上面改为挂在到这个新的内容区域。代码如下:
相关文章推荐
- androidUI第三部分---1.3.2不使用xml文件手工代码实现布局
- Android setContentView 实现同一个activity下不同view的切换
- setContentView(R.layout.activity_);ui->setupUi(this);
- ndroid setContentView 实现同一个activity下不同view的切换
- 切换Activity中布局的setContentView( )方法
- Android setContentView 实现同一个activity下不同view的切换
- setContentView()实现布局页面的跳转
- Android setContentView 实现同一个activity下不同view的切换
- Android布局文件的加载过程分析:Activity.setContentView()源码分析
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起(写的很好,这个不是从启动app说的,说的是UI是怎么绘制的)
- Android中通过ViewHelper.setTranslationY实现View移动控制(NineOldAndroids开源项目)
- Android代码报错:setContentView(R.layout.activity_main)
- Android代码报错:setContentView(R.layout.activity_main)
- Android中通过ViewHelper.setTranslationY实现View移动控制(NineOldAndroids开源项目)
- setContentView()给当前Activity加载布局出错
- 通过setContentView设置activity的不同样式
- 布局共享(列如所有activity拥有相同的布局部分,比如actionbar,在BaseActivity中写入布局)
- Android中通过ViewHelper.setTranslationY实现View移动控制(NineOldAndroids开源项目)
- 布局共享(如所有ACTIVITY拥有相同的布局部分,比如ACTIONBAR,在BASEACTIVITY中写入布局)