先贴代码:

/** * RelativeLayout、LinerLayout以及FrameLayout布局使用对应的params * 如:RelativeLayout.LayoutParams LinerLayout.LayoutParams * 普通的组件(Button TextView等可以使用ViewGroup.LayoutParams) *注:其实有的时候RelativeLayout.LayoutParams LinerLayout.LayoutParams可以混用,但是他们有各自特有的方法特性,如果 * 需要用到这个特定的方法的时候就不能够混用了。 * */public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //setContentView(R.layout.activity_main);        initView();    }    private void ConverView(){        final LinearLayout mask = new LinearLayout(this);        mask.setOrientation(LinearLayout.VERTICAL);        LinearLayout.LayoutParams maskParams = new LinearLayout.LayoutParams(                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);        mask.setBackgroundColor(getResources().getColor(R.color.red));        Button btn = new Button(this);        final Button btn2 = new Button(this);        ViewGroup.LayoutParams btnParams = new ViewGroup.LayoutParams(                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);        btn.setText("click");        btn2.setText("click2");        btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //mask.removeView(btn2);                //mask.removeAllViews();                //mask.setVisibility(View.GONE);                //一层一层覆盖View                ConverView();            }        });        btn2.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //一层一层的剥离View                mask.setVisibility(View.GONE);            }        });        mask.addView(btn,btnParams);        //addView是在对应的布局上增加View        mask.addView(btn2,btnParams);        //是在原有的视图上覆盖一个视图(就是这里的截图2上的)        addContentView(mask,maskParams);        //mask.removeView(btn);    }    private void initView() {        // 获取xml的RelativeLayout        LinearLayout layout = new LinearLayout(this);        layout.setOrientation(LinearLayout.VERTICAL);        for (int i = 0; i < 5; i++) {            //布局是LinerLayout的话这里一般就是使用LinearLayout.LayoutParams什么布局使用什么            LinearLayout.LayoutParams llParams = new LinearLayout.LayoutParams(                    ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);            // 每行都有一个linearlayout            LinearLayout lLayout = new LinearLayout(this);            lLayout.setId(i + 10);            lLayout.setOrientation(LinearLayout.HORIZONTAL);            LinearLayout.LayoutParams lLayoutlayoutParams = new LinearLayout.LayoutParams(                    ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);            lLayout.setLayoutParams(lLayoutlayoutParams);            TextView tv = new TextView(this);            tv.setId(i);            tv.setText("这是第" + i + "个文本框");            tv.setTextColor(Color.BLUE);            TextView tv_num = new TextView(this);            tv_num.setId(i + 20);            tv_num.setText(i + "台");            tv_num.setTextColor(Color.RED);            // 为TextView添加长高设置            ViewGroup.LayoutParams layoutParams_txt = new ViewGroup.LayoutParams(                    ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);            tv.setLayoutParams(layoutParams_txt);            tv_num.setLayoutParams(layoutParams_txt);            // 添加到每行的linearlayout中            lLayout.addView(tv);            lLayout.addView(tv_num);            // 每个linearlayout都在前一个的下面,第一个在顶,不处理            if (i > 0) {               // relativeParams.addRule(RelativeLayout.BELOW, i + 10 - 1);            }            // 把每个linearlayout加到relativelayout中            layout.addView(lLayout, llParams);            //setContentView(layout);        }        Button btn = new Button(this);        ViewGroup.LayoutParams btnParams = new ViewGroup.LayoutParams(                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);        btn.setText("覆盖View");        btn.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                ConverView();            }        });        layout.addView(btn,btnParams);        //就是Activity上显示的最底层的View        setContentView(layout);    }}

效果图:
第一步、
Android纯代码写布局_第1张图片
第二步、
Android纯代码写布局_第2张图片
第三步、不断点击click,就会不断的覆盖 颜色也会不断的加深,点击click2覆盖的View就会不断的剥离,颜色就会慢慢恢复。
主要是理解:
1、addContentView setcontentView addView
2、RelativeLayout、LinerLayout以及FrameLayout布局使用对应的params怎么选择(见代码的最上面)

注:
1、setcontentView :
使用setContentView可以在Activity中动态切换显示的View,这样,不需要多个Activity就可以显示不同的界面,因此不再需要在Activity间传送数据,变量可以直接引用。但是,在android SDK给我们建的默认的Hello World程序中,调用的是setContentView(int layoutResID)方法,如果使用该方法切换view,在切换后再切换回,无法显示切换前修改后的样子,也就是说,相当于重新显示一个view,并非是把原来的view隐藏后再显示。其实setContentView是个多态方法,我们可以先用LayoutInflater把布局xml文件引入成View对象,再通过setContentView(View view)方法来切换视图。因为所有对View的修改都保存在View对象里,所以,当切换回原来的view时,就可以直接显示原来修改后的样子。
2、addContentView setcontentView 的区别
两者的区别主要包括两点:
1). 以添加UI组件是否被移除
setContentView() 会导致先前添加的被移除, 即替换性的;
而 addContentView() 不会移除先前添加的UI组件,即是累积性的

2). 是否控制布局参数
addContentView() 有两个参数, 可以控制布局参数; 你指出的这个setContentView 没有接受布局参数,
默认使用MATCH_PARENT; 不过setContentView()也有带两个参数的版本, 可以控制布局参数。

3、addview
在原有的view上增加组件

//后期会更新从源码角度的分析

更多相关文章

  1. "error: Error retrieving parent for item: No resource found
  2. Android中向服务器发送数据的Post和Get方法
  3. 图片旋转的两种方法
  4. 【Android 性能优化】布局渲染优化 ( GPU 过度绘制优化总结 | CP
  5. android sdk 兼容低版本的处理方法
  6. Android后端服务器的搭建方法
  7. 保持Android手机屏幕长亮的方法
  8. Android 崩溃分析 方法论

随机推荐

  1. mysql 存储过程判断重复的不插入数据
  2. Mysql单文件存储删除数据文件容量不会减
  3. mysql模糊查询like与REGEXP的使用详细介
  4. Mysql存储引擎详解
  5. mysql 正则表达式查询含有非数字和字符的
  6. MySQL的隐式类型转换整理总结
  7. Mysql利用group by分组排序
  8. Mysql百万级分页优化技巧
  9. MySql创建带解释的表及给表和字段加注释
  10. 详解Centos7 修改mysql指定用户的密码