Android 查漏补缺之布局篇

╰半夏微凉° 2022-04-03 14:26 307阅读 0赞

想想自己学习android也有一年多了,但是一直没有系统学习,也没有发过一篇关于android的博客,觉得自己android都还没正式入门,今天开始重新学习android,一边看视频教程一边上机实践,并把所学的感悟的心得开贴记录下来。不追求翔实的纪录,只留一些我的思考后的心得,所以读者最好有一点android基础。

今天主要的讲的是布局。

线性布局LinearLayout

属性android:layout_weight

在郭大大的《第一行代码》中给了一个有关layout_weight的小demo,布局代码大致如下

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:orientation="horizontal"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent">
  7. <EditText
  8. android:id = "@+id/et1"
  9. android:layout_width="0dp"
  10. android:layout_height="wrap_content"
  11. android:layout_weight="1"
  12. android:text="Type something"/>
  13. <Button
  14. android:layout_width="0dp"
  15. android:layout_height="wrap_content"
  16. android:layout_weight="1"
  17. android:text="Send"
  18. android:visibility="visible" />
  19. </LinearLayout>

其效果如下
在这里插入图片描述

注意父LinearLayout布局的方向必须要设置为horizontal(默认值),因为子元素是在水平方向上切分父布局,如果设置为vertical的话子元素因为宽度为0而无法显示。

郭大大说得很明白,但是这里我强调一点的是:子元素切分的是父布局剩下来的空间

比如上面的例子假如我把EditText的宽度设置为50dp而不是0dp,那么EditText先分得50dp后再和Button平分父布局剩下来的宽度(屏幕宽度-50dp),所以EditText比Button宽50dp。

由于安卓的碎片化,手机像素不一,app开发时设置宽高一般用dp而不是px,文字大小用sp

这样一来,郭大大的第二个有关layout_weight的demo也很容易明白了。

android:layout_gravity和android:gravity

它们的共同点是可选值都是top,bottom,left,right,center_vertical,center_horizontalcenter等,各属性值见名知意,且可以通过|组合使用。

在《第一行代码》中是这样描述它们的区别的

android:gravity用于指定文字在控件中的对齐方式,而android:gravity用于指定控件在布局中的对齐方式

我通过上机编码发现,上面的说法是有失偏驳的。

我觉得下面的描述才比较准确。

android:gravity:是对view控件本身来说的,是用来设置view本身的内容应该显示在view的什么位置,默认值是左侧。也可以用来设置布局中的控件位置

android:layout_gravity:是相对于包含改元素的父元素来说的,设置该元素在父元素的什么位置;比如TextView: android:layout_gravity表示TextView在界面上的位置,android:gravity表示TextView文本在TextView的什么位置,默认值是左侧

简而言之,gravity和layout_gravity的可以实现的效果是一样的,只不过gravity用在父元素中,用于控制子元素在父元素中的位置,而layout_gravity用在子元素中,也是控制子元素在父元素中的位置,可以推理,在EditText设置gravity,是控制EditText的子元素,也就是text的显示位置的。来看下面两份代码

代码:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6. <LinearLayout
  7. android:layout_width="match_parent"
  8. android:orientation="vertical"
  9. android:layout_height="match_parent">
  10. <EditText
  11. android:id = "@+id/et1"
  12. android:layout_gravity="center"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:text="hello_world"/>
  16. </LinearLayout>
  17. </LinearLayout>

其显示效果如下

在这里插入图片描述
center=center_horizontal|center_vertical
但是为什么EditText只显示在屏幕水平中央,而没有在垂直中央呢?
这是因为父布局LinearLayout的方向是vertical,它是垂直扩展的,所以它的高度是不确定的,高度的一半在哪也是不知道的,所以设置垂直居中是失效(其实完整来说是设置垂直方向的layout_gravity属性会失效,其他比如bottom等也会失效)。
类似地,如果把父布局方向设置为horizontal,EditText就会显示在垂直中央而不是水平中央。

再来看下一份代码:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6. <LinearLayout
  7. android:layout_width="match_parent"
  8. android:orientation="vertical"
  9. android:gravity="center"
  10. android:layout_height="match_parent">
  11. <EditText
  12. android:id = "@+id/et1"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:text="hello_world"/>
  16. </LinearLayout>
  17. </LinearLayout>

仅有两行不同,其显示效果如下:
在这里插入图片描述
这就是真正的水平和垂直居中了,所以这就是它们的效果差异吧,理论上它们可以达到的显示效果应该是一样的,只不过由于某些原因layout_gravity的某些设置实现会失效。

相对布局RelativeLayout

我觉得相对布局挺简单的,注意一点:相对布局不像线性布局那样会从左往右或者从上往下排列,如果你不设置位置的话,它会一直从屏幕左上方开始,而无论叠了多少层。

至于属性设置,都是见名知意,不赘述了。

发表评论

表情:
评论列表 (有 0 条评论,307人围观)

还没有评论,来说两句吧...

相关阅读

    相关 RxJava补缺

    RxJava概念 标准中的观察者设计模式,一个被观察者,多个观察者,多次注册。 RxJava是改装的观察者设计模式,一个订阅(注册) 一个观察者。 一旦满足 起点

    相关 CSS补缺

    块级格式上下文(Block formatting context) 普通流(Normal Flow) 在普通流中,元素按照其在 HTML 中的先后位置至上而下布局,

    相关 CC++补缺

    培养个人才能,无可替代,确定个人职业目标,专业技术性人才,自主学速度习,提升专业能力,打字速度是基本功,多加练习,实现盲打,提高准确度,速度,练习时间,3个月,每天1小时,专业

    相关 HashMap 补缺

    HashMap 是面试的钉子户了,网上分析的文章也有很多,相信大家对于原理已经烂俗于心了。但最近在看源码时,发现其中一些实现细节其实不太好理解,所以决定以问答的形式在这里记录一

    相关 补缺

         今天早上一起来腰酸背痛, 昨晚3点多才睡着,  看来不规律的睡觉真的是很害人啊·····  这样下去身体会垮的, 我什么也没做·· 可是最近身体感觉越来越差了 人