Android纯代码写布局

先贴代码:


/**
 * 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);


    }
}

效果图:
第一步、
这里写图片描述
第二步、
这里写图片描述
第三步、不断点击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上增加组件

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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值