android案例--继承实现UI公用
2017-08-20 本文已影响78人
return_toLife
其实这次是自己学习的时候遇到的坑:
- 需求分析:让activity共享一部分UI
- 应用案例:toolbar,或者只想改变activity中的点击事件,ui复用
- 思路分析:写一个activity的子类,然后将公共部分的UI在这个子类activity中 实现,命名为BaseActivity,最后所有要共享此部分UI的activity都继承这个BaseActivity
国际惯例,效果图:
Paste_Image.png1. 我们一般是用setContentView来渲染我们的UI,但是父类调用一次,子类调用一次,总会有一方会被覆盖的,那么我们先来看看setContentView到底做了什么
Paste_Image.png(ps:图片出处后面会说明)
一、DecorView为整个Window界面的最顶层View。
二、DecorView只有一个子元素为LinearLayout。代表整个Window界面,包含通知栏,标题栏,内容显示栏三块区域。
三、LinearLayout里有两个FrameLayout子元素。
(20)为标题栏显示界面。只有一个TextView显示应用的名称。也可以自定义标题栏,载入后的自定义标题栏View将加入FrameLayout中。
(21)为内容栏显示界面。就是setContentView()方法载入的布局界面,加入其中。
所以要实现activity具有公共部分的UI,重写setContentView()方法;
2. ok,那我们现在来实现BaseActivity并重写setContentView()方法:
public class BaseActivity extends Activity {
//把父类activity和子类activity的view都add到这里
private LinearLayout parentLinearLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initContentView(R.layout.layout_baseactivity);
}
/**
* 初始化contentview
*/
private void initContentView(int layoutResID) {
ViewGroup viewGroup = (ViewGroup) findViewById(android.R.id.content);
viewGroup.removeAllViews();
parentLinearLayout = new LinearLayout(this);
parentLinearLayout.setOrientation(LinearLayout.VERTICAL);
viewGroup.addView(parentLinearLayout);
LayoutInflater.from(this).inflate(layoutResID, parentLinearLayout, true);
}
@Override
public void setContentView(int layoutResID) {
LayoutInflater.from(this).inflate(layoutResID, parentLinearLayout, true);
}
@Override
public void setContentView(View view) {
parentLinearLayout.addView(view);
}
@Override
public void setContentView(View view, ViewGroup.LayoutParams params) {
parentLinearLayout.addView(view, params);
}
}
(ps:三个重写的setContentView可以根据自己的情况来重写哪个)
3. 然后子类按照我们正常的情况写,就能显示两个布局在一起了