android案例--继承实现UI公用

其实这次是自己学习的时候遇到的坑:

  • 需求分析:让activity共享一部分UI
  • 应用案例:toolbar,或者只想改变activity中的点击事件,ui复用
  • 思路分析:写一个activity的子类,然后将公共部分的UI在这个子类activity中 实现,命名为BaseActivity,最后所有要共享此部分UI的activity都继承这个BaseActivity

国际惯例,效果图:

Paste_Image.png

1. 我们一般是用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. 然后子类按照我们正常的情况写,就能显示两个布局在一起了

原文地址

推荐阅读更多精彩内容