布局与控件(二)——与你想象不一样的LinearLayout

第2节 LinearLayout

线性布局是安卓应用开发中最经常用到的布局之一。它能让放置与内部的控件或者子布局按照水平或竖直放置。

这里我们将介绍它最为常用的几个性质。

2.1 orientation属性

它可以让内部的控件或者子布局按照水平或者竖直方向,呈线性排列。设置android:orientation为:

  1. vertical:按照竖直方向排列;
  2. horizontal:安卓水平方向排列;
<LinearLayout
    android:layout_width="match_parent"
    android:layout_width="wrap_content"
    <!--设置水平或者竖直的值-->
    android:orientation="vertical">
    ......
</LinearLayout>

2.2 layout_weight属性

在LinearLayout包含的子布局(或者控件)中,使用这个属性,就能告诉LinearLayout,子布局(或者控件)的权重有多大,然后按照权重的比例将剩余的空间分配给它们。

举个例子:有个工地,长和宽都是100dp,它用围墙围起来,里面竖着修房子。

  1. 第一间房要修30dp长,但是设置了layout_weight2;第二间房要修20dp长,但是设置了layout_weight1;第三间要修10dp长,但是设置了layout_weight1

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:orientation="vertical">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="30dp"
            android:layout_weight="2"/>
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="20dp"
            android:layout_weight="1"/>
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="10dp"
            android:layout_weight="1"/>
    
    </LinearLayout>

    因为每个房间都设置了高度,那么这个工地最后会被分割成100 - 30 - 20 - 10,还剩下40pd的长度。

    因为都设置了layout_weight,那么这剩下的长度,将会被按照比例分配给它们。

    第一间房,额外分配 2/(2+1+1) * 40 = 20dp

    第二间房,额外分配 1/(2+1+1) * 40 = 10dp

    第三间房,额外分配 1/(2+1+1) * 40 = 10dp

    最后就是,

    第一间房 30+20 = 50dp;

    第二间房 20+10 = 30dp;

    第三间房 10+10 = 20dp;

  2. 如果我把每个房间的高度设置成0dplayout_weight都设置成1
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:orientation="vertical">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
    
    </LinearLayout>

    那么就剩下100 - 0 - 0 - 0 = 100的高度等待分配;

    第一间房,额外分配 1/(1+1+1) * 100 = 33dp

    第二间房,额外分配 1/(1+1+1) * 100 = 33dp

    第三间房,额外分配 1/(1+1+1) * 100 = 33dp

    最后就是,

    第一间房 0+33 = 33dp;

    第二间房 0+33 = 33dp;

    第三间房 0+33 = 33dp;

  3. 如果我把每个房间的高度设置成match_parentlayout_weight设置成1
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:orientation="vertical">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"/>
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"/>
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"/>
    
    </LinearLayout>

    那么就剩下100 - 100 - 100 - 100 = -200的高度等待分配;

    第一间房,额外分配 1/(1+1+1) * (-200) = -66dp

    第二间房,额外分配 1/(1+1+1) * (-200) = -66dp

    第三间房,额外分配 1/(1+1+1) * (-200) = -66dp

    最后就是,

    第一间房 100+(-66) = 33dp;

    第二间房 100+(-66) = 33dp;

    第三间房 100+(-66) = 33dp;

2.3 weightSum属性

这个属性用来控制各个子布局(或者控件)的权重之和。默认情况下,权重值为各个子控件的权重之和,但是如果设置了这个属性,那么就以这个设定的值为准,将父LinearLayout设置android:weightSum属性,值为2

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:orientation="vertical"
    android:weightSum="2">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

</LinearLayout>

剩下的长度100dp,将会被按照比例分配。

第一间房,额外分配 1/2 * 100 = 50dp(1/2是因为weightSum被设置成了2)

因为只有一间房,所以剩下的空间不用分配了

最后就是,

第一间房 0+50 = 50dp;

还剩下50dp的空间不做任何分配;

weightSum通常在布局占位的情况下使用。比如,LinearLayout中,只包含一个TextView控件,而又只希望TextView只占用LinearLayout上半空间,那么就可以这样设计,

时间: 2024-10-09 01:53:46

布局与控件(二)——与你想象不一样的LinearLayout的相关文章

Android UI布局与控件(二)

一.View类的常用xml属性:[了解] ①.Android中所有的UI(用户界面)元素都是使用View和ViewGroup对象建立的 ②.View是一个可以将一些信息绘制在屏幕上并与用户产生交互的对象 ③.ViewGroup是一个包含多个的View和ViewGroup的容器,用来定义UI布局. ④.Android提供了一系列的View和ViewGroup的子类,开发者可以灵活地组合使用它们来完成界面布 局.界 面元素绘制和用户交互等工作 ⑤.开发者还可以选择性地继承一些系统提供的View,来自

Android学习笔记(九)——布局和控件的自定义

//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! View是 Android中一种最基本的 UI组件,它可以在屏幕上绘制一块矩形区域,并能响应这块区域的各种事件,因此,我们使用的各种控件其实就是在 View的基础之上又添加了各自特有的功能.而ViewGroup 则是一种特殊的 View,它可以包含很多的子 View和子 ViewGroup,是一个用于放置控件和布局的容器.系统默认的所有控件都是直接或间接继承自 View 的,所用的所有布局都是直接或间接继承自 Vie

Android UI布局与控件及API Guide学习(一)

一.Android学习API指南:[了解] 1. 应用的组成部分   App Components 1.1. 应用的基本原理    App Fundamentals 1.2. Activity      Activities活动 1.2.1. 片段    Fragments 1.2.2. 加载器     Loaders 1.2.3. 任务和返回堆    Tasks and Back Stack 1.3. Service服务   Services 1.3.1. 绑定服务     Bound Ser

如果写一个android桌面滑动切换屏幕的控件(二)

在viewgroup执行: public void snapToScreen(int whichScreen) { whichScreen = Math.max(0, Math.min(whichScreen, getChildCount() - 1)); boolean changingScreens = whichScreen != mCurrentScreen; mNextScreen = whichScreen; int mScrollX = this.getScrollX(); fin

IOS的一个带动画的多项选择的控件(二)

然后我们来写:TypeSelectView 这个比较简单,我们只要只要每个TypeView的位置,然后作为自己的subview就好了 @interface TypeSelectView : UIView @property(nonatomic) BOOL bShown; @property(nonatomic, strong) TypeView* curSelectedView; -(id)initWithFrame:(CGRect)frame searchType:(int)type; @en

布局与控件(五)-Toast吐司与布局的抽象标签merge include ViewStub

第5节 Toast 5.1 使用效果 Toast用来向用户弹出一个提示框,然后自动消失,就像这样, 面包机烤好面包后,就腾的一下把面包从面包机里弹出来.而这个控件显示时也像是从面包机里弹出来的,所以取了这个名字-Toast(吐司). 使用Toast显示消息的时候,即使启动它的Activity并没有显示在屏幕上,Toast提示的消息也会被显示到最前面,让用户看到.例如, Activity A正通过网络下载一个文件, 此时用户点击Home回到主界面,又启动了另一个应用的Activity B:现在Ac

布局与控件(一)——布局与控件的常用概念

第1节 布局与控件的常用概念 界面设计中的控件,就是我们常常看到的按钮 滑动条 文字显示区等等,它们就像房间里的家具,是界面设计的最小单位. 布局是一个可以容纳别的布局(或者控件)的容器.它就像是一个大的房间,房间里面可以放各种家具(控件),也可以再隔离成更多的房间(放入别的布局). 不过,两者有很多共同的地方,例如定义它们的大小.边距等等. 1.1 尺寸单位 在使用布局或控件时,有时需要指定它们的尺寸.安卓系统提供了三种单位: px:以像素为单位进行设置,屏幕上每一个点,就是一个像素,例如一部

android代码编写布局和控件

//创建线性linearlayout布局对象  LinearLayout ll = new LinearLayout(this);    //设置linearlayout布局方向  ll.setOrientation(LinearLayout.VERTICAL);    //得到布局或控件高度  int height = LinearLayout.LayoutParams.MATCH_PARENT;    //得到布局或控件宽度  int width = LinearLayout.LayoutP

07.移动先行之谁主沉浮----控件之轮流轰炸——布局类控件

如果移动方向有任何问题请参考===> 异常处理汇总-移动系列(点) 一.布局类控件 Grid.StackPanel.Canvas. VariableSizedWrapGrid 1.布局控件 - Grid 网格控件,网格布局: 相当于 HTML 中的 Table 标签: 但是注意 Table 更重要的是展示数据,而 Grid 则是专门为布局所生: 属性标记: Grid.RowDefinitions:行定义,元素类型 RowDefinition,必要属性 Height Grid.ColumnDefi