最后
我见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了5、6年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。
其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。
不断奔跑,你就知道学习的意义所在!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
LinearLayout常用XML属性和相关方法********说明
XML属性 | 相关方法 | 说明 |
android:baselineAligned | setBaselineAligned(boolean) | 设置为 false 时,防止布局对齐其子项的基线。 |
android:baselineAlignedChildIndex | setBaselineAlignedChildIndex(int) | 当线性布局是另一个基线对齐的布局的一部分时,它可以指定基线对齐到其子项中的哪个子项(即,哪个子项 TextView)。 |
android:divider | setDividerDrawable(Drawable) | 可绘制用作按钮之间的垂直分隔线。 |
android:gravity | setGravity(int) | 指定对象应如何在其自身边界内在 X 轴和 Y 轴上定位其内容。 |
android:measureWithLargestChild | setMeasureWithLargestChildEnabled | 当设置为 true 时,所有有重量的孩子都将被认为是最大孩子的最小尺寸。 |
android:orientation | setOrientation(int) | 布局应该是一列还是一行?对行使用“horizontal”,对列使用“vertical”。 |
android:weightSum | setWeightSum(float) | 定义最大权重总和。 |
LinearLayout.LayoutParams
LinearLayout包含的所有子元素都受LinearLayout.LayoutParams控制,因此LinearLayout包含的子元素可以额外指定下列属性。
LinearLayout.LayoutParams常用XML属性和相关方法说明
XML属性 | 相关方法 | 说明 |
android:layout_gravity | setGravity(int) | Gravity指定组件应如何放置在其单元组中。 必须是Gravity常量值中的一个或多个(以“|”分隔)。 |
android:layout_weight | 指示 LinearLayout 中有多少额外空间分配给 与这些 LayoutParams 关联的视图。 |
Gravity常量(必须使用一个或多个以“|”分隔。如:right|top)
Constant | Value | 描述 |
center | 11 | 将对象放置在其容器的垂直和水平轴的中心,不改变其大小。 |
center_horizontal | 1 | 将对象放置在其容器的水平中心,不改变其大小。 |
center_vertical | 10 | 将对象放在其容器的垂直中心,不改变其大小。 |
clip_horizontal | 8 | 可以设置为将子项的左边缘和/或右边缘剪裁到其容器边界的附加选项。剪辑将基于水平重力:左重力将剪辑右边缘,右重力将剪辑左边缘,两者都不会剪辑两个边缘。 |
clip_vertical | 80 | 可以设置为将子项的顶部和/或底部边缘剪裁到其容器边界的附加选项。剪辑将基于垂直重力:顶部重力将剪辑底部边缘,底部重力将剪辑顶部边缘,两者都不会剪辑两个边缘。 |
fill | 77 | 如果需要,增加对象的水平和垂直大小,使其完全填满其容器。 |
fill_horizontal | 7 | 如果需要,增加对象的水平尺寸,使其完全填满其容器。 |
fill_vertical | 70 | 如果需要,增大对象的垂直尺寸,使其完全填满其容器。 |
left | 3 | 将对象推到其容器的左侧,不改变其大小。 |
right | 5 | 将对象推到其容器的右侧,不改变其大小。 |
bottom | 50 | 将对象推到其容器的底部,而不改变其大小。 |
top | 30 | 将对象推到其容器的顶部,而不改变其大小。 |
start | 800003 | 将对象推到其容器的开头,不改变其大小。 |
end | 800005 | 将对象推到其容器的末端,不改变其大小。 |
均等分布
如要创建线性布局,让每个子组件使用大小相同的屏幕空间,请将每个视图的android:layout_height设置为"0dp"(针对垂直布局),或将每个视图的android:layout_width设置为"0dp"(针对水平布局)。然后,请将每个视图的android:layout_weight设置为"1"。例如:
<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“vertical”>
<LinearLayout
android:id=“@+id/ll_top”
android:layout_width=“match_parent”
android:layout_weight=“1”
android:background=“@color/color_188FFF”
android:orientation=“horizontal”
android:layout_height=“0dp”>
<LinearLayout
android:id=“@+id/ll_bottom”
android:layout_width=“match_parent”
android:layout_weight=“1”
android:orientation=“horizontal”
android:background=“@color/color_ff0000”
android:layout_height=“0dp”>
不等分布
你也可创建线性布局,让子元素使用大小不同的屏幕空间:
a、如果有三个文本字段,其中两个声明权重为 1,另一个未赋予权重,那么没有权重的第三个文本字段就不会展开,而仅占据其内容所需的区域。另一方面,另外两个文本字段将以同等幅度展开,填充测量三个字段后仍剩余的空间。
b、如果有三个文本字段,其中两个字段声明权重为 1,而为第三个字段赋予权重 2(而非 0),那么现在相当于声明第三个字段比另外两个字段更为重要,因此,该字段将获得总剩余空间的一半,而其他两个字段均享余下的空间。
<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:orientation=“vertical”>
<LinearLayout
android:id=“@+id/ll_top”
android:layout_width=“match_parent”
android:layout_weight=“1”
android:background=“@color/color_188FFF”
android:orientation=“horizontal”
android:layout_height=“0dp”>
<View
android:id=“@+id/view_top_1”
android:layout_width=“100dp”
android:layout_height=“match_parent”
android:background=“@color/color_ff0000”/>
<View
android:id=“@+id/view_top_2”
android:layout_width=“0dp”
android:layout_height=“match_parent”
android:layout_weight=“1”
android:background=“@color/purple_500”/>
<View
android:id=“@+id/view_top_3”
android:layout_width=“100dp”
android:layout_height=“match_parent”
android:background=“@color/color_FF773D”/>
<LinearLayout
android:id=“@+id/ll_bottom”
android:layout_width=“match_parent”
android:layout_weight=“1”
android:orientation=“horizontal”
android:background=“@color/color_ff0000”
android:layout_height=“0dp”>
<View
android:id=“@+id/view_bottom_1”
android:layout_width=“0dp”
android:layout_height=“match_parent”
android:layout_weight=“1”
android:background=“@color/color_FF773D”/>
<View
android:id=“@+id/view_bottom_2”
android:layout_width=“0dp”
android:layout_height=“match_parent”
android:layout_weight=“2”
android:background=“@color/teal_200”/>
<View
android:id=“@+id/view_bottom_3”
android:layout_width=“0dp”
android:layout_height=“match_parent”
android:layout_weight=“1”
android:background=“@color/color_ff0000”/>
二、相对布局(RelativeLayout常用)
RelativeLayout是一个视图组,每个子组件位置是相对的,可以相对于同一层级下其他控件,也可以相对于父控件。
RelativeLayout是用于设计用户界面的非常强大的实用程序,因为它可以消除嵌套视图组并保持布局层次结构平坦,从而提高性能。如果你发现自己使用了多个嵌套LinearLayout组,则可以将它们替换为单个RelativeLayout。
定位视图
RelativeLayout让子视图指定它们相对于父视图或彼此的位置(由 ID 指定)。因此,如果A组件的位置是由B组件的位置来决定,Android要求先定义B组件,再定义A组件
RelativeLayout常用XML属性和相关方法****说明****
XML属性 | 相关方法 | 说明 |
android:gravity | setGravity(int) | 指定对象应如何在其自身边界内在X轴和Y轴上定位其内容。 必须是Gravity常量值中的一个或多个(以“|”分隔)。 |
android:ignoreGravity | setIgnoreGravity(int) | 指示哪个视图不应受重力影响。 |
RelativeLayout.LayoutParams
为了控制RelativeLayout布局容器中各子组件的布局分布,RelativeLayout提供了一个内部类:RelativeLayout.LayoutParams,该类提供了大量的XML属性来控制RelativeLayout布局容器中子组件的布局分布。
RelativeLayout.LayoutParams里设的XML属性****及说明
XML属性 | 说明 |
android:layout_above | 将此视图的底部边缘定位在给定的锚视图 ID 上方。 |
android:layout_alignBaseline | 将此视图的基线定位在给定锚视图 ID 的基线上。 |
android:layout_alignBottom | 使此视图的底部边缘与给定的锚视图 ID 的底部边缘匹配。 |
android:layout_alignEnd | 使此视图的结束边缘与给定锚视图 ID 的结束边缘匹配。 |
android:layout_alignLeft | 使此视图的左边缘与给定锚视图 ID 的左边缘匹配。 |
android:layout_alignParentBottom | 如果为 true,则使此视图的底部边缘与父视图的底部边缘匹配。 |
android:layout_alignParentEnd | 如果为 true,则使此视图的结束边缘与父视图的结束边缘匹配。 |
android:layout_alignParentLeft | 如果为 true,则使此视图的左边缘与父视图的左边缘匹配。 |
android:layout_alignParentRight | 如果为 true,则使此视图的右边缘与父视图的右边缘匹配。 |
android:layout_alignParentStart | 如果为 true,则使此视图的起始边缘与父视图的起始边缘匹配。 |
android:layout_alignParentTop | 如果为 true,则使此视图的顶部边缘与父视图的顶部边缘匹配。 |
android:layout_alignRight | 使此视图的右边缘与给定锚视图 ID 的右边缘匹配。 |
android:layout_alignStart | 使此视图的起始边缘与给定锚视图 ID 的起始边缘匹配。 |
android:layout_alignTop | 使此视图的顶部边缘与给定的锚视图 ID 的顶部边缘匹配。 |
android:layout_alignWithParentIfMissing | 如果设置为 true,则在 layout_toLeftOf、layout_toRightOf 等无法找到锚点时,将使用父级作为锚点。 |
android:layout_below | 将此视图的顶部边缘定位在给定的锚视图 ID 下方。 |
android:layout_centerHorizontal | 如果为 true,则此子项在其父项内水平居中。 |
android:layout_centerInParent | 如果为 true,则此子项在其父项内水平和垂直居中。 |
android:layout_centerVertical | 如果为 true,则将此子项垂直居中于其父项内。 |
android:layout_toEndOf | 将此视图的起始边缘定位到给定锚视图 ID 的末尾。 |
android:layout_toLeftOf | 将此视图的右边缘定位在给定锚视图 ID 的左侧。 |
android:layout_toRightOf | 将此视图的左边缘定位在给定锚视图 ID 的右侧。 |
android:layout_toStartOf | 将此视图的结束边缘定位到给定锚视图 ID 的开始处。 |
android:layout_above | 将此视图的底部边缘定位在给定的锚视图 ID 上方。 |
除此之外,RelativeLayout.LayoutParams还继承了ViewGroup.MarginLayoutParams,因此RelativeLayout布局容器中每个子组件也可以指定ViewGroup.MarginLayoutParams所支持的各XML属性。
不设置相对位置(重叠在一起)
<RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:layout_width=“match_parent”
android:layout_height=“match_parent”>
<View
android:id=“@+id/view_top_1”
android:layout_width=“match_parent”
android:layout_height=“100dp”
android:background=“@color/color_666666”/>
<View
android:id=“@+id/view_top_2”
android:layout_width=“200dp”
android:layout_height=“100dp”
android:background=“@color/teal_200”/>
<View
android:id=“@+id/view_top_3”
android:layout_width=“100dp”
android:layout_height=“100dp”
android:background=“@color/color_FF773D”/>
设置相对位置,未出现重叠
<RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:layout_width=“match_parent”
android:layout_height=“match_parent”>
<View
android:id=“@+id/view_top_1”
android:layout_width=“match_parent”
android:layout_height=“100dp”
android:background=“@color/color_666666”/>
<View
android:id=“@+id/view_top_2”
android:layout_width=“200dp”
android:layout_below=“@id/view_top_1”
android:layout_height=“100dp”
android:background=“@color/teal_200”/>
<View
android:id=“@+id/view_top_3”
android:layout_width=“100dp”
android:layout_below=“@id/view_top_2”
android:layout_height=“100dp”
android:background=“@color/color_FF773D”/>
<View
android:id=“@+id/view_top_4”
android:layout_width=“100dp”
android:layout_below=“@id/view_top_2”
android:layout_toRightOf=“@id/view_top_3”
android:layout_height=“100dp”
android:background=“@color/purple_500”/>
三、网格布局(GridLayout)
GridLayout把这个容器划分成rows×columns个网格,每个网格可以放一个组件。 除此之外,也可以设置一个组件横跨多少列、一个组件纵跨多少行(支持跨行和跨列以及每个单元格组内的任意对齐形式)。
GridLayout提供了setColumnCount(int)和setRowCount(int)方法来控制该网络的列数和行数。
GridLayout的XML属性和相关方法说明
XML属性 | 相关方法 | 说明 |
android:alignmentMode | setAlignmentMode(int) | 当设置为 alignMargins 时,会导致在视图的外边界之间进行对齐,由其边距定义。 |
android:columnCount | setColumnCount(int) | 自动定位子项时要创建的最大列数。 |
android:columnOrderPreserved | setColumnOrderPreserved (boolean) | 设置为 true 时,强制列边界以与列索引相同的顺序出现。 |
android:orientation | setOrientation(int) | 布局期间不使用方向属性。 |
android:rowCount | setRowCount(int) | 自动定位子项时要创建的最大行数。 |
android:rowOrderPreserved | setRowOrderPreserved(boolean) | 设置为 true 时,强制行边界以与行索引相同的顺序出现。 |
android:useDefaultMargins | setUseDefaultMargins(boolean) | 当设置为 true 时,告诉 GridLayout 在视图的布局参数中未指定任何边距时使用默认边距。 |
GridLayout**.LayoutParams**
为了控制GridLayout布局容器中各子组件的布局分布,GridLayout提供了一个内部类:GridLayout.LayoutParams,该类提供了大量的XML属性来控制GridLayout布局容器中子组件的布局分布。
GridLayout**.LayoutParams里设的XML属性和相关方法说明**
XML属性 | 相关方法 | 说明 |
android:layout_column | 界定此视图占用的单元格组左侧的列边界。 | |
android:layout_columnSpan | 列跨度:界定此视图占用的单元格组的左右边界之间的差异。 | |
android:layout_columnWeight | 在多余空间分配期间应分配给此视图的水平空间的相对比例。 | |
android:layout_gravity | setGravity(int) | 重力指定组件应如何放置在其单元组中。 |
android:layout_row | 界定此视图占据的单元格组顶部的行边界。 | |
android:layout_rowSpan | 行跨度:界定此视图占据的单元格组的顶部和底部边界之间的差异。 | |
android:layout_rowWeight | 在多余空间分配期间应分配给此视图的垂直空间的相对比例。 |
<GridLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:columnCount=“4”
android:rowCount=“5”>
<Button
android:id=“@+id/one”
android:text=“1” />
<Button
android:id=“@+id/two”
android:text=“2” />
<Button
android:id=“@+id/three”
android:text=“3” />
<Button
android:id=“@+id/devide”
android:text=“/” />
<Button
android:id=“@+id/four”
android:text=“4” />
<Button
android:id=“@+id/five”
android:text=“5” />
<Button
android:id=“@+id/six”
android:text=“6” />
<Button
android:id=“@+id/multiply”
android:text=“×” />
<Button
android:id=“@+id/seven”
android:text=“7” />
<Button
android:id=“@+id/eight”
android:text=“8” />
<Button
android:id=“@+id/nine”
android:text=“9” />
<Button
android:id=“@+id/minus”
android:text=“-” />
<Button
android:id=“@+id/zero”
android:layout_columnSpan=“2”
android:layout_gravity=“fill”
android:text=“0” />
<Button
android:id=“@+id/point”
android:text=“.” />
<Button
android:id=“@+id/plus”
android:layout_rowSpan=“2”
android:layout_gravity=“fill”
android:text=“+” />
<Button
android:id=“@+id/equal”
android:layout_columnSpan=“3”
android:layout_gravity=“fill”
android:text=“=” />
这样的布局用LinearLayout也能做,但是相对麻烦一点,所以在适当的时候时候使用GridLayout就非常的有必要了。而且你可能注意到了,子组件中并没有指定android:layout_width和android:layout_height属性。这是因为这两个属性的默认值都是LayoutPrams.WRAP_COUNTENT,而在此,我们希望使用的就是LayoutPrams.WRAP_COUNTENT,所以就没必要指定了。GridLayout和LinaerLayout十分相似,所以将LinaerLayout替换为GridLayout也相当简单。
四、表格布局(TableLayout)
TableLayout继承了LinerarLayout,因此它的本质依然是线性布局管理器。表格采用行、列的形式来管理UI组件,TableLayout并不需要明确地声明包含多少行、多少列,而是通过TableRow、其他组件来控制表格的行数和列数。
每次向TableLayout中添加TableRow,该TableRow就是一个表格行,TableRow也是容器,因此它也可以不断的添加其他组件,每添加一个子组件该表格就增加一列。
如果直接向TableLayout添加组件,那么这个组件将直接占一行。
在TableLayout中、列的宽度由该列最宽的那个单元格决定,整个TableLayout的宽度取决于父容器的宽度(默认占满父容器)
在TableLayout中,可以为单元格设置的三种行为方式:
Collapsed:如果某列被设为Collapsed,那么该列所有单元格都会被隐藏。
Shrinkable:如果某列被设为Shrinkable,那么该列所有单元格的宽度可以被收缩,以保证该变革能适应父容器的宽度。
Stretchable:如果某列被设为Stretchable,那么该列所有单元格的宽度可以被拉伸,以保证组件能完全填充满表格空余空间。
TableLayout继承了LinerarLayout,因此它完全可以支持LinerarLayout所支持的XML属性。初次之外还支持下面的XML属性。
TableLayout的常用XML属性和相关方法********说明
XML属性 | 相关方法 | 说明 |
android:collapseColumns | setColumnCollapsed(int,boolean) | 要折叠的列的从零开始的索引。 |
android:shrinkColumns | setShrinkAllColumns(boolean) | 要收缩的列的从零开始的索引。 |
android:stretchColumns | setStretchAllColumns(boolean) | 要拉伸的列的从零开始的索引。 |
<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:layout_margin=“10dp”
android:orientation=“vertical”>
<TableLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:shrinkColumns=“1”
android:stretchColumns=“2”>
<Button
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:text=“顶层大佬” />
<Button
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:text=“不变按钮” />
<Button
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:layout_marginLeft=“10dp”
android:text=“收缩按钮” />
<Button
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:layout_marginLeft=“10dp”
android:text=“拉伸按钮” />
<TableLayout
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:collapseColumns=“0”
android:stretchColumns=“2”>
<Button
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:text=“高层大佬” />
<Button
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:text=“隐藏按钮” />
<Button
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:layout_marginLeft=“10dp”
android:text=“不变按钮” />
<Button
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:layout_marginLeft=“10dp”
android:text=“拉伸按钮” />
最后
下面是有几位Android行业大佬对应上方技术点整理的一些进阶资料。希望能够帮助到大家提升技术
高级UI,自定义View
UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。
不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
android:layout_height=“wrap_content”
android:layout_marginLeft=“10dp”
android:text=“不变按钮” />
<Button
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:layout_marginLeft=“10dp”
android:text=“拉伸按钮” />
最后
下面是有几位Android行业大佬对应上方技术点整理的一些进阶资料。希望能够帮助到大家提升技术
[外链图片转存中…(img-RKJAQ6AD-1715583317622)]
高级UI,自定义View
UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。
不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!
[外链图片转存中…(img-eQEZiRvL-1715583317622)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!