Android中使用Java代码对界面进行布局

在日常的开发中我们经常直接使用xml对界面进行布局,但是使用这种布局方式就直接把布局写死了,不能灵活的进行页面元素的展示,比如根据从服务器中请求Json数据的不同进行动态的显示布局样式,额,当然使用的频率也不算太高,当然,对于一名合格的程序员当然要掌握任何一种开发中能够使用到的技能。

这次我们通过实现一个简单的登陆页面,来学习一下Android中使用代码进行布局并记录下涉及到的知识点。

下面看一下运行的实际效果:

这里写图片描述

先贴上本次项目的实际代码,后面进行详细说明:

/**
 * 使用代码进行登录界面的布局
 * @author wangke
 */
public class CodeLayoutActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //创建一个最外层的根布局
        LinearLayout rootLayout = new LinearLayout(this);
        rootLayout.setBackgroundColor(Color.CYAN);

        //设置线性布局中子View的摆放为竖直方向
        rootLayout.setOrientation(LinearLayout.VERTICAL);
        //创建一个根部局的LayoutParams
        LinearLayout.LayoutParams rootParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        //设置根部局的Margin值
        rootParams.setMargins(DensityUtil.dip2px(this,5),DensityUtil.dip2px(this,5),DensityUtil.dip2px(this,5),DensityUtil.dip2px(this,5));
        rootParams.gravity = Gravity.CENTER_HORIZONTAL;
        rootLayout.setLayoutParams(rootParams);
        //设置最外层根部局布局的背景颜色
        rootLayout.setBackgroundColor(Color.CYAN);
        //将当前创建的根部局设置给Activity
        setContentView(rootLayout);


        //创建一个显示用户头像的ImageView
        ImageView ivIco = new ImageView(this);
        ivIco.setImageResource(R.drawable.ico);
        //将创建的用于显示头像的ImageView添加到最外层的线性布局中
        rootLayout.addView(ivIco);
        //当通过子View进行获取所在的布局的时候,rootLayout.addView(ivIco)需要写在前面,原因想起来也很清楚,当前的ImageView都还没有添加到父View如果直接通过getLayoutParams()当然会出先空指针异常(可以查看源码)
        LinearLayout.LayoutParams ivParams = (LinearLayout.LayoutParams) ivIco.getLayoutParams();
        //给用于显示头像的ImageView设置宽高
        ivParams.width = DensityUtil.dip2px(this,100f);
        ivParams.height = DensityUtil.dip2px(this,100f);
        //设置居中的方式(子View在父View下的摆放方式为水平居中)
        ivParams.gravity = Gravity.CENTER_HORIZONTAL;
        ivParams.setMargins(0,DensityUtil.dip2px(this,100),0,0);
        ivIco.setLayoutParams(ivParams);



        //创建水平排列的线性布局,用于放置账户相关的View
        LinearLayout userCountLayout = new LinearLayout(this);
        userCountLayout.setOrientation(LinearLayout.HORIZONTAL);
        //将当前的创建的线性布局添加到根View
        rootLayout.addView(userCountLayout);


        //显示用户名的TextView
        TextView tvShowUser = new TextView(this);
        tvShowUser.setText("用户名:");
        userCountLayout.addView(tvShowUser);
        LinearLayout.LayoutParams userCountlayoutParams = (LinearLayout.LayoutParams) tvShowUser.getLayoutParams();
        userCountlayoutParams.setMargins(DensityUtil.dip2px(this,20),DensityUtil.dip2px(this,20),DensityUtil.dip2px(this,20),DensityUtil.dip2px(this,20));


        //创建用于填写用户账户的EditText
        EditText edtUserCount = new EditText(this);
        userCountLayout.addView(edtUserCount);
        edtUserCount.setHint("请输入用户名");
        LinearLayout.LayoutParams edtUserCountlayoutParams = (LinearLayout.LayoutParams) edtUserCount.getLayoutParams();
        edtUserCount.setWidth(0);
        edtUserCountlayoutParams.weight = 1;
        //父View的Gravity属性,确定子View的摆放规则
        edtUserCountlayoutParams.gravity = Gravity.CENTER_VERTICAL;
        //View.setGravity方法相当于  android:gravity="center",该属性表示对View中内容进行的限定
//        edtUserCount.setGravity(Gravity.CENTER);


        //创建线性布局用于容纳密码相关的View
        LinearLayout pwdLayout =  new LinearLayout(this);
        pwdLayout.setGravity(LinearLayout.HORIZONTAL);
        LinearLayout.LayoutParams pwdLayoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);
        pwdLayout.setLayoutParams(pwdLayoutParams);
        rootLayout.addView(pwdLayout);

        //TextView显示密码文本
        TextView tvShowPwd = new TextView(this);
        tvShowPwd.setText("密    码:");
        pwdLayout.addView(tvShowPwd);
        LinearLayout.LayoutParams tvShowPwdParams = (LinearLayout.LayoutParams) tvShowPwd.getLayoutParams();
        tvShowPwdParams.setMargins(DensityUtil.dip2px(this,20),DensityUtil.dip2px(this,20),DensityUtil.dip2px(this,20),DensityUtil.dip2px(this,20));
        tvShowPwdParams.gravity = Gravity.CENTER_VERTICAL;

        //EdtText用于输入密码
        EditText edtPwd = new EditText(this);
        edtPwd.setHint("请输入密码");
        pwdLayout.addView(edtPwd);
        //使用new的方式来获取 LayoutParams
        LinearLayout.LayoutParams edtPwdParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        //设置权重
        edtPwdParams.weight = 1;
        edtPwdParams.width = 0;
        //将布局参数设置给EdtText
        edtPwd.setLayoutParams(edtPwdParams);

        //用于进行登录的button
        Button btnLogin = new Button(this);
        btnLogin.setText("登陆");
        rootLayout.addView(btnLogin);
        LinearLayout.LayoutParams btnLoginParams = (LinearLayout.LayoutParams) btnLogin.getLayoutParams();
        //设置Button的大小
        btnLoginParams.width = LinearLayout.LayoutParams.WRAP_CONTENT;
        btnLoginParams.height= LinearLayout.LayoutParams.WRAP_CONTENT;
        btnLoginParams.gravity = Gravity.CENTER_HORIZONTAL;


    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值