`
寻梦者
  • 浏览: 638135 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

android中的weight

 
阅读更多

android:layout_weight详细分析介绍:

布局文件是:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Button1"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="Button2"
/>
</LinearLayout>


出现的布局是:button1占了2/3,button2占了1/3。

但是如果将布局文件中的button的属性android:layout_width="fill_parent"改为android:layout_width="wrap_content"那么出现的结果为:button1占了1/3,button2占了2/3。

 

出现这样的结局是什么意思呢?下面是详细解释:

linearLayout中包含有weight的child时,linearLayout会measure两次:
设屏幕宽度为X
第一次:button1的measuredWidth为X,button2也为X (因为用了weight,所以linearLayout每次measure child时不考虑前一个已经占用的大小),total_width为2X
第二次:计算delta=x-total_width=-x,然后会将button1的宽度设为
x+delta*1/3=0.66x, button2的宽度为 x+delta*2/3=0.33x


      那我现在对这句话重新概括一下:“因为设置了button1的权重最小,所以它占用的布局优先级就越高”,也就是说layout_weight越小,布局优先级越高。也许在Android里面布局并没有优先级之说,我这里只是为了说明问题,自己定义的,所以朋友们不要拍砖。
      那首先分析一下当layout_width属性设置为fill_parent的时候,即充满父布局,当然意思是这个控件要根据weight的设置尽可能的大,因此,依上例而论,button1的weight设为1,button2的weight设置为2.即button1的优先级最高,因此,要填充父布局就要button1先来填充,尽可能的大,那这个尽可能又是多少呢,这就要综合layout里其它控件的weight值了,然后做一下运算,button1占据2/3,button2占据1/3.你也可以把button2设置为一个非常大的数,比如2000,此时在Graphical Layout模式下可以看到button1填充满了整个宽度,而看不到button2的影子,事实上button2还是存在的,你把鼠标指向button1的后面就可以看到一个长长的竖条,那个就是button2,已经非常非常小了。因此,在layout_width设置为fill_parent的时候,weight所代表的是你的控件要优先尽可能的大。

     接着是当layout_weight设置为wrap_content的时候,即适应内容的宽度,意思是这个控件要尽可能的小,只要能把内容显示出来就可以了,同样的,如果把button1和button2的layout_weight设置为wrap_content后,button1的weight为1,button2的weight为2.那么button1要优先尽可能的小,而button2也要尽可能的小,只是优先级不一样,因为设置了weight,所以这两个控件总的宽度要填满父布局的宽度,所以就又要计算每个控件所占据的大小,此时,button1的优先级较高,共有两份,一份1/3,一份2/3,button1要尽可能的小,那button1当然要选1/3,因此,我们看到的效果反而是button2占据的较大。这里要说的是如果把权值同样做如下设置:button1为1,button2为2000,那button1是不是就要占据1/2000的空间呢?这么理解就错了,刚才说了,要尽可能的小,但这个小是有一个限度的,那就是wrap_content,就是还要是内容完完整整的显示出来,同样的,尽可能的大也是有一个限度的,那就是父布局的宽度。因此,在layout_width设置为wrap_content的时候,weight所代表的是你的控件要优先尽可能的小。


所以,要对weight做了解,要深深的理解下面两句话:
layout_width设置为fill_parent的时候,layout_weight所代表的是你的控件要优先尽可能的大,但这个大是有限度的,即fill_parent.
layout_width设置为wrap_content的时候,layout_weight所代表的是你的控件要优先尽可能的小,但这个小是有限度的,即wrap_content.
layout_height  layout_width.

 

实际上上面做的解释主要是对fill_parent和wrap_content做的解释,我们可以参考下面的2篇博文知道,上面的解释是存在一定的问题的。

 

一般来说,我们使用layout_weight,我们可能会使用在各个控件或者布局(像LinearLayout),应用最广泛的就是DV6300-T的主界面的布局,全部用的是layout_weight来控制的,这样可以更好的适应不同的分辨率。

 

所以我们经常用layout_weight来设置布局,一般是设置不同的LinearLayout为不同的layout_weight来完成基本布局,还可以利用LinearLayout来占据空间都是没有任何显示,这样的就是完全实现比重布局的LinearLayout,最后在各个LinearLayout里面又实现多个控件的layout_weight控制,同样也可以使用只占控件无显示的控件来达到分配布局的效果,DV6300-T就是明显例子。

还需要注意的就是LinearLayout的orientation如果没有设置,那么默认的就是horizontal水平方向

 

按比例显示LinearLayout内各个子控件,需设置android:layout_width="0dp"

如果为竖直方向的设置android:layout_height="0dp"

在这种情况下某子个控件占用LinearLayout的比例为:本控件weight / LinearLayout内所有控件的weight值的和。

 

一般我们控制比重都是设置对应方向的高或宽为0dp来实现我们想的比重控制,而很少用fill_parentwrap_content,不过我们来理解这2种设置的区别。

 

还有一句话需要理解就是: 权重(layout_weight)最小,所以它占用的布局优先级就越高

还需要注意的是保存一致性控制

如果我们要控制显示比重,那么我们一般要求各个等级的元素的控制方式必须一致,比如多个button控件处于同一等级来控制比重布局,那么如果设置的是android:layout_width="0dp"这样的方式来控制,就必须把所有的等级控件都用android:layout_width="0dp"来控制,而不能有的用android:layout_width="0dp",而还有的用android:layout_width=" fill_parent ",这样就会出现混乱了。

 

下面还有一个例子:

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent">

    <LinearLayout

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:layout_weight="1">

        <Button

           android:layout_width="fill_parent"

           android:layout_height="fill_parent"

           android:layout_weight="2"

           android:background="#00AAC0"

       />

       <Button

           android:layout_width="fill_parent"

           android:layout_height="fill_parent"

           android:layout_weight="2"

           android:background="#CCdd00"

           />

       <Button

           android:layout_width="fill_parent"

           android:layout_height="fill_parent"

           android:layout_weight="1"

           android:background="#0000FF"

       />    

    </LinearLayout>

    <LinearLayout

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:layout_weight="2">

       <Button

           android:layout_width="wrap_content"

           android:layout_height="fill_parent"

           android:layout_weight="2"

           android:background="#FFAA00"

       />

       <Button

           android:layout_width="wrap_content"

           android:layout_height="fill_parent"

           android:layout_weight="2"

           android:background="#CCdd00"

       />

       <Button

           android:layout_width="wrap_content"

           android:layout_height="fill_parent"

           android:layout_weight="1"

           android:background="#0000FF"

       />    

    </LinearLayout>

    <LinearLayout

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    android:layout_weight="2">

       <Button

           android:layout_width="0dp"

           android:layout_height="fill_parent"

           android:layout_weight="2"

           android:background="#00FF00"

       />

       <Button

           android:layout_width="0dp"

           android:layout_height="fill_parent"

           android:layout_weight="2"

           android:background="#CCdd00"

       />

       <Button

           android:layout_width="0dp"

           android:layout_height="fill_parent"

           android:layout_weight="1"

           android:background="#cc00FF"

       />    

    </LinearLayout>

</LinearLayout>

分享到:
评论

相关推荐

    详解Android中weight的使用方法

    在Android开发中,`weight`属性是LinearLayout布局中的一个关键特性,它允许我们在不同尺寸的屏幕上灵活地调整组件的大小,以实现响应式设计。在本文中,我们将深入探讨`weight`属性的工作原理以及如何有效地使用它...

    Android weight属性demo

    在Android开发中,`weight`属性是LinearLayout布局管理器中的一个重要概念,用于实现视图组件的权重分配,尤其是在处理屏幕尺寸适配时显得尤为重要。`weight`属性是Android为了解决在不同分辨率和屏幕尺寸设备上保持...

    4种Android屏幕自适应解决方案

    本文就介绍了4中Android屏幕自适应解决方案。 一、细说layout_weight 目前最为推荐的Android多屏幕自适应解决方案。 该属性的作用是决定控件在其父布局中的显示权重,一般用于线性布局中。其值越小,则对应的...

    Android移动开发-Weight计算.zip

    在Android移动开发中,"Weight"一词通常与布局管理器相关,特别是LinearLayout中的`layout_weight`属性。这个属性在创建动态、响应式界面时非常关键,因为它允许开发者分配视图组件之间的空间比例,而不仅仅是固定...

    Android实训购物车页面

    -&lt;LinearLayout android:background="@drawable/aaa" android:weightSum="1" android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical" xmlns:android=...

    Android中在xml中静态添加Fragment

    在Android应用开发中,Fragment是Android SDK提供的一种组件,它允许开发者在单个Activity中实现多个可交互的屏幕区域。Fragment的设计使得应用可以更好地适应不同的屏幕尺寸和配置,如手机和平板。本教程将深入讲解...

    2011.10.13(4)——— android android:layout_weight

    在Android开发中,`android:layout_weight`是一个非常重要的属性,尤其在布局管理器中,如LinearLayout。这个属性主要用于在有限的空间内分配组件的大小,根据权重比例来决定每个子视图占据的屏幕空间。本篇文章将...

    Android中Button样式新方法

    在Android开发中,创建带有图标的按钮是一种常见的需求,这可以使用户界面更加直观且易于操作。传统的Button组件虽然可以直接设置背景图来实现图标与文字的结合,但有时我们需要更灵活的布局方式。本文将介绍一种...

    计算器(android)

    在每个内部的水平布局中,按钮的布局权重(`android:layout_weight`)被用来确保它们能平均分配空间。例如,两个Button组件都设置了`android:layout_weight="1"`,意味着它们会占据相同的空间,无论它们的原始尺寸...

    Android购物车代码

    -&lt;LinearLayout android:background="@drawable/aaa" android:weightSum="1" android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical" xmlns:android=...

    android中的布局

    在Android开发中,布局(Layout)是构建用户界面的核心组件,它定义了应用程序屏幕上元素的排列方式和相互关系。本文将深入探讨Android中的布局机制,尤其是`TableLayout`的使用和实现细节。 首先,Android提供了...

    Android 中文 API (19) —— TwoLineListItem

    android:layout_weight="1" android:listSelector="@drawable/list_selector" android:divider="@color/divider_color" android:dividerHeight="1dp" android:cacheColorHint="#00000000" android:choiceMode=...

    Android中显示在标题上的进度条

    android:layout_weight="1" android:layout_height="wrap_content" /&gt; ``` 接下来,我们需要处理后台任务来更新进度条。在Android中,`AsyncTask` 是一个方便的异步处理工具,用于在后台执行耗时操作,并且可以...

    android常见的布局

    在Android应用开发中,布局(Layout)是构建用户界面的核心元素。...通过`android:weightSum`属性定义总权重,而子视图的`android:layout_weight`属性则分配每个子视图的权重,权重高的子视图占据的空

    Android移动应用开发线性布局LinearLayout的weight属性简介.pdf

    总结,LinearLayout的weight属性是Android开发中实现动态布局的重要工具,它可以帮助开发者轻松应对不同设备尺寸的挑战,创建出适应性强、用户体验良好的应用程序界面。正确理解和使用weight属性,是提升Android应用...

    Android Studio动态加载Fragment和获取实例的方法

    android:layout_weight="1" /&gt; ``` 接下来,我们来看一下 Fragment 的布局文件。我们定义了两个 Fragment:OneFragment 和 TwoFragment。每个 Fragment 都有自己的布局文件: ```xml &lt;!-- OneFragment --&gt; ...

    Android中ListView左右联动

    在Android应用开发中,ListView是显示大量数据列表的常用组件,而实现ListView的左右联动功能可以为用户带来更丰富的交互体验。左右联动通常指的是当用户在ListView中的某一项上进行操作时,右侧或其他相关组件会...

    weight属性详解

    `LinearLayout`是Android中最基本也是最常用的布局之一,它可以设置为垂直布局(`android:orientation="vertical"`)或水平布局(`android:orientation="horizontal"`)。通过`android:gravity`属性,可以控制子控件...

    Android中EditText密码样式设置

    android:layout_weight="1" android:hint="请输入密码" android:inputType="textPassword" /&gt; android:id="@+id/cb_show_password" android:layout_width="wrap_content" android:layout_height="wrap_...

Global site tag (gtag.js) - Google Analytics