题 Android上的重力和layout_gravity之间的差异


我知道我们可以设置以下值 android:gravity 和 android:layout_gravity 特性:

  1. center
  2. center_vertical
  3. center_horizontal

但我对这两个问题感到困惑。

用法有什么区别 android:gravity 和 android:layout_gravity


1149
2017-08-14 09:28


起源


容易记住的诀窍:将“布局 - 引力”称为“外部重力” - Vishnu Haridas
center == center_vertical | CENTER_HORIZONTAL - Yousha Aleayoub
这些视频让我了解了很多不同之处: youtube.com/watch?v=DxfYeAUd238  youtube.com/watch?v=1FyAIWLVcTc - Roni Castro
ImageView似乎表现得与...不同 TextView的。 - samsara


答案:


他们的名字可以帮助你:

  • android:gravity 设置内容的重力(即它的子视图) View 它用于。
  • android:layout_gravity 设定的重力 View 要么 Layout 相对于其父母。

一个例子是 这里


1197
2017-08-14 09:31



在里面:)谢谢塞菲 - Ben Sewards
基本上,一切都与 layout_ 定义影响外部元素的东西。 - Triang3l
看,我觉得这很有趣,因为如果我只是取消名字,我的直觉就是另一种方式。每次,我认为“layout_gravity”意味着“这个ViewGroup如何展示它的内容的重力”,而“gravity”则是“这个视图所倾向于的地方”。 - Ogre
那么如果发生什么呢? android:gravity 设置为左和它的孩子的 android:layout_gravity 是对的?孩子们哪一方对齐? - Thupten
正如@Suragch评论他的回答,layout_gravity仅适用于LinearLayout和FrameLayout。但是LinearLayout对它有约束。 - Marco Luglio


区别

android:layout_gravity 是个  观点的引力。指定视图应触及其父边框的方向。

android:gravity 是个  视图的重力。指定其内容应对齐的方向。

HTML / CSS等价物

Android                 | CSS
————————————————————————+————————————
android:layout_gravity  | float
android:gravity         | text-align

简单的技巧,以帮助您记住

采取 layout-gravity 作为“外放重力”。


446
2017-07-25 17:07





内 - 外

  • gravity 安排内容  风景。
  • lay_gravity 安排视图的位置  本身。

有时候看图片也会有所帮助。绿色和蓝色是 TextViews 和其他两种背景颜色 LinearLayouts

enter image description here

笔记

  • layout_gravity 对于a中的视图不起作用 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。)

所以记住, 布局_gravity在其中排列视图 布局。重力排列视图内的内容。 

XML

以下是上述图片的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>

有关


433
2017-10-04 05:43





简答:使用 android:gravity 要么 setGravity() 控制容器的所有子视图的重力;使用 android:layout_gravity 要么 setLayoutParams() 控制容器中单个视图的重力。

长篇故事:在线性布局容器中控制重力,如 LinearLayout 要么 RadioGroup,有两种方法:

1)控制a的所有子视图的重力 LinearLayout 容器(就像你在书中所做的那样),使用 android:gravity (不 android:layout_gravity)在布局XML文件或 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(或center_vertical),可以更改为top或bottom。实际上是默认的 layout_gravity 价值是 -1 但是Android把它放在垂直中心。

要在水平线性容器中更改子视图的水平位置,可以使用 layout_weight子视图的边距和填充。

同样,对于垂直视图组容器,其子视图的垂直重力在另一个下方顶部对齐,无法更改。默认水平重力是中心(或 center_horizontal)并可以改为左或右。

实际上,像按钮这样的子视图也有 android:gravity XML属性和 setGravity() 控制其子视图的方法 - 其中的文本。该 Button.setGravity(int) 与此有关 developer.android.com条目


35
2017-07-30 20:01





从我可以收集到的 layout_gravity 是父视图中视图的重力,和 重力 是该视图中儿童的重力。

我认为这是对的,但找出答案的最好方法是玩。


32
2017-08-14 09:37





看图像清楚重力


23
2018-02-04 07:17





虽然问题已经回答,但我有一些示例展示了使用gravity,layout_gravity和layout_weight。

你可以在这里找到例子 http://juanpickselov.com/LayoutExamples.zip 

我在Eclipse中创建了文件,删除了.svn子文件夹,并包含了样式,字符串,颜色等。布局文件是演示的主要内容。由于我是Java和Android开发新手,人们可能会发现Java效率低下。这些文件可以复制到Eclipse Project中,或者我也在Netbeans中使用它们,并为该IDE提供了Android开发插件。


10
2017-11-23 05:43



不知何故,两年半之后,示例链接产生了404。 - Tony Adams


如果我们想在视图中设置内容的重力,那么我们将使用“android:gravity”,如果我们想在其父视图中设置此视图的重力(作为一个整体),那么我们将使用“android: layout_gravity”。


9
2018-04-09 21:21