android设置布局,android常用布局方式

android布局控件之LinearLayout详解

Android布局控件之LinearLayout详解

创新互联公司主营七台河网站建设的网络公司,主营网站建设方案,重庆App定制开发,七台河h5微信平台小程序开发搭建,七台河网站营销推广欢迎七台河等地区企业咨询

LinearLayout是线性布局控件,它包含的子控件将以横向或竖向的方式排列,按照相对位置来排列所有的widgets或者其他的containers,超过边界时,某些控件将缺失或消失。因此一个垂直列表的每一行只会有一个widget或者是container,而不管他们有多宽,而一个水平列表将会只有一个行高(高度为最高子控件的高度加上边框高度)。LinearLayout保持其所包含的widget或者是container之间的间隔以及互相对齐(相对一个控件的右对齐、中间对齐或者左对齐)。

xml属性

android:baselineAligned:是否允许用户调整它内容的基线。

android:baselineAlignedChildIndex:当一个线性布局与另一个布局是按基线对齐的一部分,它可以指定其内容的基线对齐方式。

android:gravity:指定如何在该对象中放置此对象的内容(x/y坐标值)。

android:orientation:设置它内容的对其方向(横向/竖向)。

gravity 这个英文单词是重心的意思,在这里就表示停靠位置的意思。

android:layout_gravity 和 android:gravity 的区别

从名字上可以看到,android:gravity是对元素本身说的,元素本身的文本显示在什么地方靠着换个属性设置,不过不设置默认是在左侧的。

android:layout_gravity是相对与它的父元素说的,说明元素显示在父元素的什么位置。

比如说button:android:layout_gravity 表示按钮在界面上的位置。 android:gravity表示button上的字在button上的位置。

可选值

这两个属性可选的值有:top、bottom、left、right、center_vertical、fill_vertical、center_horizontal、fill_horizontal、center、fill、clip_vertical。

而且这些属性是可以多选的,用“|”分开。

默认这个的值是:Gravity.LEFT

LinearLayout还支持为其包含的widget或者是container指定填充权值。好处就是允许其包含的widget或者是container可以填充屏幕上的剩余空间。这也避免了在一个大屏幕中,一串widgets或者是containers挤成一堆的情况,而是允许他们放大填充空白。剩余的空间会按这些widgets或者是containers指定的权值比例分配屏幕。默认的 weight 值为0,表示按照widgets或者是containers实际大小来显示,若高于0的值,则将Container剩余可用空间分割,分割大小具体取决于每一个widget或者是container的layout_weight及该权值在所有widgets或者是containers中的比例。例如,如果有三个文本框,其中两个指定的权值为1,那么,这两个文本框将等比例地放大,并填满剩余的空间,而第三个文本框不会放大,按实际大小来显示。如果前两个文本框的取值一个为2,一个为1,显示第三个文本框后剩余的空间的2/3给权值为2的,1/3大小给权值为1的。也就是权值越大,重要度越大。

如果LinearLayout包含子LinearLayout,子LinearLayout之间的权值越大的,重要度则越小。如果有LinearLayout A包含LinearLayout C,D,C的权值为2,D的权值为1,则屏幕的2/3空间分给权值为1的D,1/3分给权值为2的C。在LinearLayout嵌套的情况下,子LinearLayout必须要设置权值,否则默认的情况是未设置权值的子LinearLayout占据整个屏幕

关于Android布局你不知道的

Android常见的5个布局,我想大家一定不会陌生。LinearLayout、RelativeLayout和FrameLayout也是使用频率较高的布局方式,做Android开发的一定使用过。

传统的5种布局方式:

不过我的问题并不是问面试者如何使用这些基础的布局,而是要看面试者怎么解决布局嵌套(影响性能)和屏幕适配问题。

我们都清楚Android界面的布局太复杂,嵌套层次过深,会使整个界面的测量、布局和绘制变得更复杂,对性能会造成影响。所以我们在写Layout文件时,也要尽量避免布局的嵌套层次过深的问题。

在怎么解决问题之前,我们得有一个好方法先判断当前的问题情况。Android SDK工具箱中有一个叫做Hierarchy Viewer的工具,能够在App运行时分析Layout。

注意: 在ROOT的手机,或者是安装开发版的ROM的手机可以直接使用Hierarchy Viewer。如果没有Root的手机(SDK 4.1及以上),需要在你的PC端添加一个环境变量“ANDROID_HVPROTO=ddm”。

下面列举一些面试者常使用的方式。

merge merge标签的作用是合并UI布局,使用该标签能降低UI布局的嵌套层次。

merge标签可用于两种情况:

ViewStub ViewStub标签引入的布局默认不会inflate,既不会显示也不会占用位置。 ViewStub常用来引入那些默认不会显示,只在特殊情况下显示的布局,如数据加载进度布局、出错提示布局等。

需要在使用时手动inflate:

ViewStub在一定的程度可以起到减少嵌套层次的作用,特别是很多时候我们的程序可能不需要走到ViewStub的界面。

include 将可复用的组件抽取出来并通过include标签使用,但include标签能减少布局的层次吗?

我认为不能。include主要解决的是相同布局的复用问题,它并不能减少布局的层次。

用RelativeLayout代替LinearLayout

很多人为了减少布局层次喜欢用RelativeLayout代替LinearLayout,不过可能达到的效果并不会很明显。层次是减少了,但本身RelativeLayout就会比LinearLayout性能差一点。

有一些界面,比如一个图片和一个文本的布局(ListItem常见的布局方式),可以利用TextView有drawableLeft, drawableRight等属性,完全不需要RelativeLayout或者LinearLayout布局。

传统的布局方式存在一定的缺陷,如RelativeLayout要两次测量(measure)它的子View才能知道确切的高度;如果LinearLayout布局的子View有设置了layout_weight,那么它也需要测量两次才能获得布局的高度。

相对于传统的布局方式,Android官方还推出了两种新的布局方式:ConstraintLayout和FlexboxLayout。

ConstraintLayout ConstraintLayout即约束布局,在2016年由Google I/O推出。ConstraintLayout和RelativeLayout有点类似,控件之间根据依赖关系而存在,但比RelativeLayout更加灵活。创建大型复杂的布局仍然可以使用扁平的层级(不用嵌套View Group),说的简单些就是,再复杂的界面也可以只有2层层次。

要使用ConstraintLayout需要在build.gradle中添加相关的support库:

使用ConstraintLayout可以有效的解决布局嵌套过多导致的性能问题,官方也对其渲染性能进行了优化,并且ConstraintLayout支持可视化的方式编写布局。

不过学会熟练使用ConstraintLayout会需要一点时间,但这是值得的。

FlexBoxLayout 做过前端开发(CSS方面)的同学对FlexBox一定不会陌生,最近我在做微信小程序开发时也涉及到FlexBox。FlexBox(弹性布局)是w3c在2009年提出的一种新的布局方案,解决以前那种传统css的盒模型的局限性。

Google开源了FlexboxLayout布局和前端CSS FlexBox布局具有相同的功能(肯定有不一样的地方),但已经足够在Android上改进布局的构建方式。

FlexBoxLayout可以理解成一种更高级的LinearLayout,不过比LinearLayout更加强大和灵活。如果我们使用LinearLayout布局的话,那么不同的分辨率,也许我们要重新调整布局,势必会需要跟多的布局文件放在不同的资源目录。而使用FlexBoxLayout来布局的话,它可以适应各种界面的改变(所以叫响应式布局)。

如果对前端的Flexbox不太了解的话,你还需要补一些概念,好在这些东西在网上很容易找到。

可能很多读者会觉这样的面试题是吹毛求疵,很多项目中哪有这么复杂的界面,根本就用不到这些优化措施。

可以说厉害的人,或者叫高手,可能只是比较多在意这些细节而已。在实践中的经历告诉我,很多难于解决的性能问题,并不是因为有一个影响性能的问题无法攻克,而是没有一个明显的制约因素,是有各种小问题一点一点堆积起来,最终积重难返。

所以,把细节做好,或者意识到细节的地方可能引发的问题,对我们解决问题是很有帮助的,不要浪费了让你可以成长的细节。

有需要更多Android高级进阶和面试资料的朋友可以私信我获取

android 动态设置布局宽度

例如设置一个图片宽高 关键代码:

//取控件当前的布局参数

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) imageView.getLayoutParams();

//设置宽度值

params.width = dip2px(MainActivity.this, width);

//设置高度值

params.height = dip2px(MainActivity.this, height);

//使设置好的布局参数应用到控件

imageView.setLayoutParams(params);

1

2

3

4

5

6

7

8

1

2

3

4

5

6

7

8

高度除了可以设置成以上固定的值,也可以设置成wrap_content或match_content

ViewGroup.LayoutParams.WRAP_CONTENT

ViewGroup.LayoutParams.MATCH_PARENT

1

2

1

2

在这里插入图片描述

xml

Android 布局之FrameLayout

1 .FrameLayout简介

设计FrameLayout是为了显示单一项widget。通常,不建议使用FrameLayout显示多项内容;因为它们的布局很难调节。不用layout_gravity属性的话,多项内容会重叠;使用layout_gravity的话,能设置不同的位置。layout_gravity可以使用如下取值:

top :将对象放在其容器的顶部,不改变其大小.

bottom:将对象放在其容器的底部,不改变其大小.

left:将对象放在其容器的左侧,不改变其大小.

right:将对象放在其容器的右侧,不改变其大小.

center_vertical:将对象纵向居中,不改变其大小.

垂直对齐方式:垂直方向上居中对齐。

fill_vertical:必要的时候增加对象的纵向大小,以完全充满其容器. 

垂直方向填充

center_horizontal:将对象横向居中,不改变其大小. 

水平对齐方式:水平方向上居中对齐

fill_horizontal:必要的时候增加对象的横向大小,以完全充满其容器. 

水平方向填充:center

将对象横纵居中,不改变其大小.

fill:必要的时候增加对象的横纵向大小,以完全充满其容器.

clip_vertical:附加选项,用于按照容器的边来剪切对象的顶部和/或底部的内容. 剪切基于其纵向对齐设置:顶部对齐时,剪切底部;底部对齐时剪切顶部;除此之外剪切顶部和底部.

垂直方向裁剪

clip_horizontal

附加选项,用于按照容器的边来剪切对象的左侧和/或右侧的内容. 剪切基于其横向对齐设置:左侧对齐时,剪切右侧;右侧对齐时剪切左侧;除此之外剪切左侧和右侧.

水平方向裁剪

注意: 区分“android:gravity”和“android:layout_gravity”。

android:gravity   :是对控件本身来说的,是用来设置“控件自身的内容”应该显示在“控件自身体积”的什么位置,默认值是左侧。

android:layout_gravity :是相对于控件的父元素来说的,设置该控件在它的父元素的什么位置

2. FrameLayout示例

创建一个activity,包含2组FrameLayout:1组设置android:layout_gravity属性,另1组不设置android:layout_gravity属性。

layout文件

?xml version="1.0" encoding="utf-8"?

LinearLayout xmlns:android=""

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="vertical"

!-- 示例1 FrameLayout内容重叠 --

TextView

    android:text="示例1, FrameLayout内容重叠"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    /

FrameLayout

    android:layout_width="300dp"

    android:layout_height="80dp"

    TextView

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="我是TextView,内容比较长"

        android:background="#ff0000"/

    Button

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:background="#ffff00"

        android:text="我是按钮"/

/FrameLayout

!-- 示例2 FrameLayout使用layout_gravity属性 --

TextView

    android:text="示例2, 设置layout_gravity"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    /

FrameLayout

    android:layout_width="300dp"

    android:layout_height="120dp"

    TextView

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="文本居左"

        android:background="#ff0000"

        android:gravity="center"

        android:layout_gravity="left"

        android:layout_margin="10dp"/

    TextView

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="文本居中"

        android:background="#ffff00"

        android:gravity="center"

        android:layout_gravity="center"/

/FrameLayout

/LinearLayout

android如何在代码里设置布局

在线性布局LinearLayout里加入view比较简单,因为属性比较少,布局简单

示例,加入一个TextView

LinearLayout layout = (LinearLayout)findViewById(R.id.layout);

TextView tv = new TextView(this);

tv.setText("hello,world");

LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

layout.addView(tv,lp);

在相对布局中RelativeLayout中加入view,属性较多

示例,加入TextView和Button,让TextView居中,并且设置Button在TextView的下方

RelativeLayout layout;

TextView tv = new TextView(this);

tv.setText("hello,world");

Button btn = new Button(this);

btn.setText("button");

tv.setId(0x011);

btn.setId(0x012);

LayoutParams tvLp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

LayoutParams btnLp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

//添加布局规则,居中于父类

tvLp.addRule(RelativeLayout.CENTER_IN_PARENT,RelativeLayout.TRUE);

//添加布局规则,在tv的下方

btnLp.addRule(RelativeLayout.BELOW, tv.getId());

layout.addView(tv,tvLp);

layout.addView(btn,btnLp);

public void addRule(int verb, int anchor) 方法就是给view设定布局规则,verb是规则属性,就是xml文件中的各种属性值,anchor是依靠的view的id或者比如上面的RelativeLayout.CENTER_IN_PARENT的时候就是设置true或false


名称栏目:android设置布局,android常用布局方式
地址分享:http://csdahua.cn/article/dsesich.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流