setgravity - Android上的重力和layout_gravity之間的差異




textview gravity (12)

我知道我們可以將以下值設置為android:gravityandroid:layout_gravity屬性:

  1. center
  2. center_vertical
  3. center_horizontal

但是我對這兩個都感到困惑。

android:gravityandroid:layout_gravity的用法有什麼區別?


區別

android:layout_gravity是視圖的外部重力。 指定視圖應該觸及其父邊界的方向。

android:gravity是該視圖的內部重力。 指定其內容應在哪個方向對齊。

HTML / CSS等價物

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

簡單的技巧來幫助你記住

layout-gravity看作“Lay-outside-gravity”。


內部 - 外部

  • gravity排列視圖的內容。
  • lay out _gravity排列視圖的位置。

有時候也可以看到一張照片。 綠色和藍色是TextViews ,另外兩種背景顏色是LinearLayouts

筆記

  • layout_gravity不適用於RelativeLayout視圖。 將它用於LinearLayoutFrameLayout視圖。 請參閱我的補充答案了解更多詳情。
  • 視圖的寬度(或高度)必須大於其內容。 否則gravity不會有任何影響。 因此, wrap_contentgravity是沒有意義的。
  • 視圖的寬度(或高度)必須小於父級。 否則, layout_gravity不會有任何效果。 因此, match_parentlayout_gravity在一起毫無意義。
  • layout_gravity=centerlayout_gravity=center_horizontal在此處看起來相同,因為它們處於垂直線性佈局。 在這種情況下,你不能垂直居中,所以layout_gravity=center只能水平居中。
  • 這個答案只針對佈局中的視圖設置gravitylayout_gravity 。 要了解在設置父佈局本身的gravity時會發生什麼,請查看我在上面提到的補充答案 。 (總結: gravityRelativeLayout上不能很好地工作,但對於LinearLayout可能有用。)

請記住, layout _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>

有關


gravitylayout-gravity有很多不同之處。 我將解釋我關於這兩個概念的經驗( 我得到的所有信息都是由於我的觀察和一些網站 )。

FrameLayout使用重力和佈局重力.....

注意:-

  1. 重力視圖內容中使用,因為某些用戶有答案,並且所有ViewGroup Layout都相同。

  2. Layout-gravity與父視圖一起使用,因為某些用戶有答案。

  3. Gravity and Layout-gravity 對於 FrameLayout孩子來說更有用We can't use Gravity and Layout-gravity在FrameLayout的標籤中We can't use Gravity and Layout-gravity ....

  4. 我們可以使用layout-gravity將Child View設置在FrameLayout任何位置。

  5. 我們可以在FrameLayout中使用每一個重力值(例如: - center_verticalcenter_horizontalcentertop等),但其他ViewGroup佈局是不可能的。

  6. FrameLayout完全處理Layout-gravity 。 示例: - 如果您使用FrameLayout不需要更改整個Layout來添加新的View。 你只需要在FrameLayout 添加View作為最後一個,並給他Layout-gravity值( 這是使用FrameLayout進行佈局重力的好處 )。

看例子......

<?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 ViewRelativeLayout View使用Gravity,這在FrameLayout View是不可能的。

LinearLayout的方向垂直....

注意: - 在這裡,我們只能設置3個layout_gravity值,即( 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的方向水平....

注意: - 在這裡我們可以設置layout_gravity 3個值( top | bottom (也稱為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設置為相同的位置....


setGravity() :使用android:gravitysetGravity()來控制容器的所有子視圖的重力; 使用android:layout_gravitysetLayoutParams()來控制容器中單個視圖的重力。

長篇故事:為了控制線性佈局容器(如LinearLayoutRadioGroup引力,有兩種方法:

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視圖的水平位置,可以使用子視圖的layout_weight ,margin和padding。

同樣,對於垂直視圖組容器,其子視圖的垂直重力頂部對齊,並且不能更改。 默認的水平重力是中心(或center_horizontal ),可以更改為左側或右側。

實際上,像按鈕這樣的子視圖也具有android:gravity XML屬性和setGravity()方法來控制其子視圖 - 其中的文本。 Button.setGravity(int)鏈接到此developer.android.com條目


引力 :用於簡單的視圖,如textview,edittext等

layout_gravity :僅用於當前視圖的重力,在其相對父視圖(如線性佈局或框架佈局)的上下文中使視圖處於中心或其父項的任何其他重力。


一個簡單的竅門就是重力適用於地球內部的我們。 所以, android:gravity就是視圖內部

記住_gravity out這會幫助你記住android:layout_gravity會引用視圖外部


兩者的基本區別在於 -

android:gravity用於視圖的子元素。

android:layout_gravity相對於父視圖用於此元素。


只是認為我會在這裡添加自己的解釋 - 來自iOS背景,這就是我如何在iOS中內化兩者:“佈局引力”影響您在超級視圖中的位置。 “重力”會影響你內部的子視圖的位置。 換句話說,佈局重力讓你自己定位你的孩子,而重力定位你的孩子。


從我可以收集的內容來看,layout_gravity是該視圖在其父代中的重心,而重力則是該視圖內兒童的重心。

我認為這是對的,但要找出最好的辦法就是玩。


我在Sandip的博客上看到的幾乎錯過的東西,解決了我的問題。 他說layout_gravity LinearLayout

如果您使用的是LinearLayout ,並且重力設置會使您堅如磐石(如我),那麼切換到其他位置。

實際上,我切換到了RelativeLayout然後在2個包含的TextView上使用了layout_alignParentLeftlayout_alignParentRight ,使它們在一行上遠離左側和右側。


雖然這個問題已經得到解答,但我有一些示例演示了使用重力,layout_gravity和layout_weight。

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

我在Eclipse中創建了這些文件,刪除了.svn子文件夾並包含了樣式,字符串,顏色等。佈局文件是演示的主要內容。 由於我是Java和Android開發新手,人們可能會發現Java效率低下。 這些文件可以復製到Eclipse項目中,或者我也可以在Netbeans中使用它們,並為該IDE提供Android開發插件。


看看圖像清晰的重力





android-gravity