我知道我们可以为android:gravity
和android:layout_gravity
属性设置以下值:
center
center_vertical
center_horizontal
等但是我对这两者感到困惑。
android:gravity
和android:layout_gravity
的用法有什么区别?
他们的名字应该可以帮助您:
android:gravity
设置的内容(即其子视图)重力View
它的使用。 android:layout_gravity
设置View
或Layout
相对于其父View
的重力。 而一个例子是在这里 。
gravity
将内容排列在视图内部 。 lay <strong>out</strong> _gravity
自编视图的位置本身之外 。 有时也有助于查看图片。绿色和蓝色是TextViews
,其他两种背景颜色是LinearLayouts
。
layout_gravity
不适用于RelativeLayout
视图。将其用于LinearLayout
或FrameLayout
视图。请参阅我的补充答案以获取更多详细信息。 gravity
将不会有任何影响。因此, wrap_content
和gravity
没有意义。 layout_gravity
将不起作用。因此, match_parent
和layout_gravity
在一起毫无意义。 layout_gravity=center
在这里看起来与layout_gravity=center_horizontal
相同,因为它们处于垂直线性布局中。在这种情况下,您不能垂直居中,因此layout_gravity=center
仅水平居中。 gravity
和layout_gravity
。若要查看在设置父布局本身的gravity
时会发生什么,请查看我上面提到的补充答案 。 (摘要: gravity
在RelativeLayout
上不能很好地工作,但在LinearLayout
可能很有用。) 因此请记住, layout _gravity 在其layout 中安排一个视图。重力将内容安排在视图内部。
这是上面图像的 xml 供您参考:
<?xml version="1.0" encoding="utf-8"?>
<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:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#e3e2ad"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="24sp"
android:text="gravity=" />
<TextView
android:layout_width="200dp"
android:layout_height="40dp"
android:background="#bcf5b1"
android:gravity="left"
android:text="left" />
<TextView
android:layout_width="200dp"
android:layout_height="40dp"
android:background="#aacaff"
android:gravity="center_horizontal"
android:text="center_horizontal" />
<TextView
android:layout_width="200dp"
android:layout_height="40dp"
android:background="#bcf5b1"
android:gravity="right"
android:text="right" />
<TextView
android:layout_width="200dp"
android:layout_height="40dp"
android:background="#aacaff"
android:gravity="center"
android:text="center" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="#d6c6cd"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="24sp"
android:text="layout_gravity=" />
<TextView
android:layout_width="200dp"
android:layout_height="40dp"
android:layout_gravity="left"
android:background="#bcf5b1"
android:text="left" />
<TextView
android:layout_width="200dp"
android:layout_height="40dp"
android:layout_gravity="center_horizontal"
android:background="#aacaff"
android:text="center_horizontal" />
<TextView
android:layout_width="200dp"
android:layout_height="40dp"
android:layout_gravity="right"
android:background="#bcf5b1"
android:text="right" />
<TextView
android:layout_width="200dp"
android:layout_height="40dp"
android:layout_gravity="center"
android:background="#aacaff"
android:text="center" />
</LinearLayout>
</LinearLayout>
android:layout_gravity
是视图的外部重力。指定视图应接触其父级边框的方向。
android:gravity
是该视图的内部重力。指定其内容应沿哪个方向对齐。
Android | CSS
————————————————————————+————————————
android:layout_gravity | float
android:gravity | text-align
将layout-gravity
作为 “外部重力”。
简短的答案:使用android:gravity
或setGravity()
控制容器的所有子视图的重力;使用android:layout_gravity
或setLayoutParams()
控制容器中单个视图的重力。
长话大说:要控制线性布局容器(例如LinearLayout
或RadioGroup
重力,有两种方法:
1)要控制LinearLayout
容器的所有子视图的重力(如您在书中所做的那样),请在布局 XML 文件中使用android:gravity
(而不是android:layout_gravity
)或在代码中使用setGravity()
方法。
2)要控制子视图在其容器中的重力,请使用android:layout_gravity
XML 属性。在代码中,需要获取视图的LinearLayout.LayoutParams
并设置其重力。下面是一个代码示例,该示例将按钮设置在水平容器的底部:
import android.widget.LinearLayout.LayoutParams;
import android.view.Gravity;
...
Button button = (Button) findViewById(R.id.MyButtonId);
// need to cast to LinearLayout.LayoutParams to access the gravity field
LayoutParams params = (LayoutParams)button.getLayoutParams();
params.gravity = Gravity.BOTTOM;
button.setLayoutParams(params);
对于水平LinearLayout
容器,其子视图的水平重力一个接一个地左对齐,并且无法更改。将android:layout_gravity
设置为center_horizontal
无效。默认的垂直重力为中心(或 center_vertical),可以更改为顶部或底部。实际上,默认的layout_gravity
值为-1
但 Android 会将其垂直居中。
要在水平线性容器中更改子视图的水平位置,可以使用子视图的layout_weight
,margin 和 padding。
类似地,对于垂直视图组容器,其子视图的垂直重力在一个顶部与另一个视图之间对齐,并且不能更改。默认的水平重力为 center(或center_horizontal
),可以更改为左或右。
实际上,诸如按钮之类的子视图也具有android:gravity
XML 属性和setGravity()
方法来控制其子视图 - 其中的文本。 Button.setGravity(int)
链接到此developer.android.com 条目 。
根据我的收集, layout_gravity是该视图在其父视图中的重力,而重力是该视图在子视图中的子重力。
我认为这是对的,但找出答案的最佳方法是随处游玩。
看一下图像以了解重力
尽管问题已经回答,但我还是有一些示例说明了重力,layout_gravity 和 layout_weight 的使用。
您可以在http://juanpickselov.com/LayoutExamples.zip 中找到示例。
我在 Eclipse 中创建了文件,删除了. svn 子文件夹,并包含了样式,字符串,颜色等。布局文件是演示的重点。由于我是 Java 和 Android 开发的新手,因此可能会发现 Java 效率低下。可以将文件复制到 Eclipse 项目中,或者我也已在 Netbeans 中将它们与可用于该 IDE 的 Android 开发插件一起使用。
如果要在视图中设置内容的重力,则将使用 “android:gravity”;如果要在其父视图中设置该视图(整体)的重力,则将使用 “android: layout_gravity”。
只是以为我会在这里添加自己的解释 - 来自 iOS 的背景,这就是我将 iOS 术语中的这两个内部化的方式:“布局重力” 会影响您在超级视图中的位置。 “重力” 会影响子视图在您内部的位置。换句话说,“布局重力” 使您自己定位,而重力使孩子定位。
gravity
和layout-gravity
有很多区别。我将解释我对这两个概念的经验( 由于观察和获得一些网站而获得的所有信息 )。
在
FrameLayout
使用重力和布局重力.....
注意:-
由于某些用户有答案,因此在视图内容中使用了重力,并且所有ViewGroup Layout
都使用重力 。
由于某些用户有答案,因此Layout-gravity
与父视图一起使用。
Gravity and Layout-gravity
对于 FrameLayout
更有用 。 We can't use Gravity and Layout-gravity
在 FrameLayout 的 Tag ... 中We can't use Gravity and Layout-gravity
。
我们可以使用layout-gravity
在FrameLayout
任何位置设置 Child View。
我们可以使用 FrameLayout 内部的每个重力值(例如: center_vertical
, center_horizontal
, center
, top
等),但其他 ViewGroup Layouts 则不可能。
FrameLayout
完全在Layout-gravity
上工作。示例:- 如果您使用FrameLayout
则无需更改整个布局即可添加新的 View。您只需将 View作为最后一个添加到FrameLayout
然后为他提供具有值的Layout-gravity
。( 这是 FrameLayout 的 layout-gravity 的优点 )。
看例子...
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="100dp"
android:textSize="25dp"
android:background="#000"
android:textColor="#264bd1"
android:gravity="center"
android:layout_gravity="center"
android:text="Center Layout Gravity"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="80dp"
android:textSize="25dp"
android:background="#000"
android:textColor="#1b64b9"
android:gravity="bottom"
android:layout_gravity="bottom|center"
android:text="Bottom Layout Gravity" />
<TextView
android:layout_width="wrap_content"
android:layout_height="80dp"
android:textSize="25dp"
android:background="#000"
android:textColor="#d75d1c"
android:gravity="top"
android:layout_gravity="top|center"
android:text="Top Layout Gravity"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="80dp"
android:textSize="25dp"
android:background="#000"
android:layout_marginTop="100dp"
android:textColor="#d71f1c"
android:gravity="top|right"
android:layout_gravity="top|right"
android:text="Top Right Layout Gravity"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="80dp"
android:textSize="25dp"
android:background="#000"
android:layout_marginBottom="100dp"
android:textColor="#d71cb2"
android:layout_gravity="bottom"
android:gravity="bottom"
android:text="Top Left Layout Gravity"/>
</FrameLayout>
输出:-
在 LinearLayout 中使用重力和布局重力.....
Gravity
工作原理与上面相同,但这里的区别在于,我们可以在LinearLayout View
和RelativeLayout View
内使用 Gravity,而这在FrameLayout View
是不可能的。
垂直方向的 LinearLayout ....
注意:- 在这里,我们只能设置layout_gravity
3 个值,即( left
| right
| center
(也称为center_horizontal
))。
看例子:-
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="100dp"
android:textSize="25dp"
android:background="#000"
android:textColor="#264bd1"
android:gravity="center"
android:layout_gravity="center_horizontal"
android:text="Center Layout Gravity \nor \nCenter_Horizontal"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="80dp"
android:textSize="25dp"
android:background="#000"
android:layout_marginTop="20dp"
android:textColor="#d75d1c"
android:layout_gravity="right"
android:text="Right Layout Gravity"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="80dp"
android:textSize="25dp"
android:background="#000"
android:layout_marginBottom="100dp"
android:textColor="#d71cb2"
android:layout_gravity="left"
android:layout_marginTop="20dp"
android:gravity="bottom"
android:text="Left Layout Gravity"/>
</LinearLayout>
输出:-
方向水平的 LinearLayout ....
注意:- 在这里我们还可以设置 3 个layout_gravity
值,即( top
| bottom
| center
(也称为center_vertical
))。
看例子:-
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="horizontal"
android:layout_height="match_parent">
<TextView
android:layout_width="120dp"
android:layout_height="100dp"
android:textSize="25dp"
android:background="#000"
android:textColor="#264bd1"
android:gravity="center"
android:layout_gravity="bottom"
android:text="Bottom \nLayout \nGravity"/>
<TextView
android:layout_width="120dp"
android:layout_height="100dp"
android:textSize="25dp"
android:background="#000"
android:layout_marginTop="20dp"
android:textColor="#d75d1c"
android:layout_gravity="center"
android:text="Center \nLayout \nGravity"/>
<TextView
android:layout_width="150dp"
android:layout_height="100dp"
android:textSize="25dp"
android:background="#000"
android:layout_marginBottom="100dp"
android:textColor="#d71cb2"
android:layout_gravity="left"
android:layout_marginTop="20dp"
android:text="Left \nLayout \nGravity"/>
</LinearLayout>
输出:-
注意:- 我们无法在RelativeLayout Views
使用layout_gravity
,但可以使用gravity
将RelativeLayout
设置为相同位置。