美文网首页Android技术知识Android开发程序员
Android 动态添加布局的两种方式

Android 动态添加布局的两种方式

作者: 侯蛋蛋_ | 来源:发表于2017-10-15 09:25 被阅读0次

    前言

    大多数时候我们布局都是用xml来布局的,但有些时候也是会用到动态布局的,尤其是在一些大项目中,动态布局更是体现的淋漓尽致。
    所以今天我们就来学习一些动态加添布局的两种方式,分别是

    • 动态添加xml布局

      • 另外写一个xml布局,然后通过java的方式让他加载他主布局上
    • 动态添加java布局

      • 通过java写出一个布局,然后再通过java的方式让他加载他主布局上

    一、动态添加xml布局

    步骤

    第一步构造容器

    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(   
                        LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); 
    
    第二步构造xml文件

    这里我们就主布局添加个button就可以了,用来点击加载xml布局,被添加布局里面我就写一个TextView,由于比较简单这里就不贴了

    第三步构造LayoutInflater

    提到addview,首先要了解一下LayoutInflater类。这个类最主要的功能就是实现将xml表述的layout转化为View的功能。为了便于理解,我们可以将它与findViewById()作一比较,二者都是实例化某一对象,不同的是findViewById()是找xml布局文件下的具体widget控件实例化,而LayoutInflater找res/layout/下的xml布局文件来实例化的。

    而LayoutInflater有三种方式

    LayoutInflater inflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);或
    
    LayoutInflater inflater = LayoutInflater.from(Activity.this);或
    
    LayoutInflater inflater = getLayoutInflater();
    

    这三种方法本质是相同的。

    第四步inflate()加载布局

    用LayoutInflater.inflate() 将LayOut文件转化成VIew。

    View view = inflater.inflate(R.layout.block_gym_album_list_item, null);
    this.addContentView(view,lp);
    

    关于第一步显示布局的详细介绍

    改变布局主要是通过改变LayoutParams来实现的,LayoutParams继承于Android.View.ViewGroup.LayoutParams。它相当于一个Layout的信息包,封装了Layout的位置、高、宽等信息。需要注意的是,需要注意到要修改的View的父容器是什么类型的,FrameLayout,LinearLayout,RelativeLayout等,因为不同类型的LayoutParams是不同的。

    上述代码与以下xml布局代码作用相同:

    <LinearLayout>
            <View
                      android:layout_width="wrap_content"
                      android:layout_height="wrap_content"
                      android:layout_centerInParent="true"/>
    </LinearLayout>
    

    改变布局位置

    addRule可传入不同的布局参数,如addRule(RelativeLayout.BELOW, R.id.XXX); 表示该View位于XXX下面。常用的布局参数有以下:

    layoutParams.alignWithParent = true  如果对应的兄弟元素找不到的话就以父元素做参照物
    RelativeLayout.CENTER_HORIZONTAL   在父控件中水平居中
    RelativeLayout.CENTER_VERTICAL   在父控件中垂直居中
    RelativeLayout.CENTER_IN_PARENT  相对于父控件完全居中
    RelativeLayout.ALIGN_PARENT_BOTTOM  紧贴父控件的下边缘
    RelativeLayout.ALIGN_PARENT_TOP  紧贴父控件的上边缘
    RelativeLayout.ALIGN_PARENT_LEFT紧贴父控件的左边边缘
    RelativeLayout.ALIGN_PARENT_RIGHT  紧贴父控件的右边缘
    RelativeLayout.ABOVE 在某元素的上方  需要第二个参数为某元素的ID
    RelativeLayout.BELOW 在某元素的下方 需要第二个参数为某元素的ID
    RelativeLayout.LEFT_OF 在某元素的左边 需要第二个参数为某元素的ID
    RelativeLayout.RIGHT_OF  在某元素的右边 需要第二个参数为 某元素的ID
    RelativeLayout.ALIGN_TOP 本元素的上边缘和某元素的的上边缘对齐 需要第二个参数为某元素的ID
    RelativeLayout.ALIGN_BOTTOM 本元素的上边缘和某元素的的下边缘对齐 需要第二个参数为某元素的ID
    RelativeLayout.ALIGN_LEFT  本元素的上边缘和某元素的的左边缘对齐 需要第二个参数为某元素的ID
    RelativeLayout.ALIGN_RIGHT  本元素的上边缘和某元素的的右边缘对齐 需要第二个参数为某元素的ID
    RelativeLayout.ALIGN_BASELINE   本元素的基线和某元素的的基线对齐 需要第二个参数为某元素的ID
    

    二、动态添加java布局

    我们这里还是以TextView为例,其实动态添加java布局和xml布局有异曲同工之处,无非就是用java的方式写出控件,然后添加进布局里

    第一步构造容器

    和上面xml布局的一样,所以这里就不贴了

    第二步构造控件布局框架

    其实和xml的第二步也是一样的,只不过xml已经写好了最外层的布局,所以我们也要用java写出一个布局,好在里面放控件

    LinearLayout view = new LinearLayout(this); 
            view.setLayoutParams(lp);//设置布局参数 
            view.setOrientation(LinearLayout.HORIZONTAL);// 设置子View的Linearlayout// 为垂直方向布局 
            //定义子View中两个元素的布局 
            ViewGroup.LayoutParams vlp = new ViewGroup.LayoutParams( 
                    ViewGroup.LayoutParams.WRAP_CONTENT, 
                    ViewGroup.LayoutParams.WRAP_CONTENT); 
    

    第三步添加控件

    其实这一步也没有什么好讲的,就是xml添加控件的方式改成java添加

    TextView tv1 = new TextView(this); 
            tv1.setLayoutParams(vlp);//设置TextView的布局 
            tv1.setText("姓名:");
    

    第四部将控件添加至容器

     view.addView(tv1);//将TextView 添加到子View 中 
    

    相关文章

      网友评论

        本文标题:Android 动态添加布局的两种方式

        本文链接:https://www.haomeiwen.com/subject/mohxuxtx.html