Android'de gravity ve layout_gravity arasındaki fark nedir?


1328

Ben android:gravityve android:layout_gravityözellikleri için aşağıdaki değerleri ayarlayabilirsiniz biliyorum :

  1. center
  2. center_vertical
  3. center_horizontal, vb.

Ama her ikisiyle de kafam karıştı.

Kullanımı arasındaki fark nedir android:gravityve android:layout_gravity?


265
Hatırlanması kolay hile: "Yerçekimi" yi "Yerçekimi-Yerçekimi" olarak kabul edin
Vishnu Haridas

6
center == center_vertical | center_horizontal
Yousha Aleayoub

4
Bu videolar farkı anlamama yardımcı oldu: youtube.com/watch?v=DxfYeAUd238 youtube.com/watch?v=1FyAIWLVcTc
Roni Castro

ImageView'dan farklı gibi görünüyor TextView.
samis

Yanıtlar:


1346

İsimleri size yardımcı olmalı:

  • android:gravitykullanıldığı içeriğin yerçekimini (yani alt görünümlerini) belirler View.
  • android:layout_gravityViewveya Layoutebeveyne göre yerçekimini ayarlar .

Ve bir örnek burada .


88
Temel olarak, her layout_şey dışarıdaki öğeleri etkileyen bir şey tanımlar.
Triang3l

29
Bakın, bunu komik buluyorum, çünkü isimlerden çıkarsam, sezgim tam tersidir. Her seferinde, "layout_gravity" ifadesinin "bu ViewGroup'un içeriğini nasıl ortaya koyduğu için yerçekimi" anlamına geldiğini ve "bu yerçekiminin" "bu Görünüm'ün yerçekimi" olduğu yerdir.
Ogre

15
Öyleyse android:gravity, sola ve çocukları sağa ayarlanırsa ne olur android:layout_gravity? çocuklar hangi tarafa hizalanacak?
Mart'ta Thupten

2
@Suragch'ın cevabına yorum yaptığı gibi, layout_gravity yalnızca LinearLayout ve FrameLayout'ta çalışır. LinearLayout'ın bununla ilgili kısıtlamaları var.
Marco Luglio

1
@Thupten Çok güzel bir soru. Sanırım biri hakim olacak (sanırım çocukların layout_gravity) ve diğeri sadece geçerli olan için varsayılan.
Trilarion

522

İçeri dışarı

  • gravityiçeriği görünüm içinde düzenler .
  • layout_gravitygörünümün konumunu kendi dışına düzenler .

Bazen bir resim görmeye de yardımcı olur. Yeşil ve mavi TextViewsve diğer iki arka plan rengi vardır LinearLayouts.

resim açıklamasını buraya girin

notlar

  • layout_gravityBir görünümler için çalışmaz RelativeLayout. Bir LinearLayoutveya içindeki görünümler için kullanın FrameLayout. Daha fazla ayrıntı için ek cevabımı inceleyin.
  • Görünümün genişliği (veya yüksekliği) içeriğinden daha büyük olmalıdır. Aksi takdirde gravityherhangi bir etkisi olmaz. Bu nedenle, wrap_contentve gravityanlamsız birlikte.
  • Görünümün genişliği (veya yüksekliği) üst öğeden daha az olmalıdır. Aksi takdirde layout_gravityherhangi bir etkisi olmaz. Bu nedenle, match_parentve layout_gravityanlamsız birlikte.
  • Buradaki gibi layout_gravity=centergörünüyor layout_gravity=center_horizontalçünkü dikey bir doğrusal düzende. Bu durumda dikey olarak ortalayamazsınız, bu nedenle layout_gravity=centeryalnızca yatay olarak ortalanır.
  • Bu cevap yalnızca ayar ele gravityve layout_gravitybir düzen içinde görünümlerde. gravityÜst mizanpajın kendisini ayarladığınızda ne olacağını görmek için yukarıda bahsettiğim ek cevaba bakın . (Özet: gravityüzerinde iyi çalışmaz, RelativeLayoutancak a ile yararlı olabilir LinearLayout.)

Yani, hatırlamak düzen _gravity düzenler onun bir görünüm düzeni . Yerçekimi içeriği görünüm içinde düzenler.

xml

İşte referans için yukarıdaki görüntü için 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>

İlişkili


görsel olarak gördükten sonra daha kolay görünüyor, teşekkürler Suragch.
Haritsinh Gohil

466

Fark

android:layout_gravitygörünümün dış çekimidir. Görünüm'ün üst öğesinin kenarlığına dokunması gereken yönü belirtir.

android:gravityo Görüşün İç çekimidir. İçeriğinin hangi yönde hizalanması gerektiğini belirtir.

HTML / CSS Eşdeğeri

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

Hatırlamanıza yardımcı olacak kolay hile

Al layout-gravity"Lay-dış-yerçekimi" olarak.


web geliştirme geçmişiniz olduğunda daha mantıklı.
Haritsinh Gohil

40

Kısa Cevap: bir kabın tüm çocuk görüşlerinin yerçekimini kontrol etmek android:gravityveya kullanmak setGravity(); kullanmak android:layout_gravityya da setLayoutParams()bir kap içinde tek bir bakış kontrol yerçekimi.

Uzun hikaye: LinearLayoutveya gibi doğrusal bir düzen konteynerindeki yerçekimini kontrol etmek RadioGroupiçin iki yaklaşım vardır:

1) Bir LinearLayoutkabın TÜM alt görünümlerinin yerçekimini ( kitabınızda yaptığınız gibi ) kontrol etmek için, düzen XML dosyasında (kodda android:gravitydeğil android:layout_gravity) düzeninde (değil ) kullanın setGravity().

2) Alt görünümünün kabındaki yerçekimini denetlemek için android:layout_gravityXML özniteliğini kullanın . Kod olarak, LinearLayout.LayoutParamsgörüşün alınması ve yerçekiminin ayarlanması gerekir. Yatay olarak yönlendirilmiş bir kapta bir düğmeyi aşağıya ayarlayan bir kod örneği:

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);

Yatay LinearLayoutkonteyner için, çocuk görüşünün yatay yerçekimi birbiri ardına sola hizalanır ve değiştirilemez. Ayar android:layout_gravityiçin center_horizontalhiçbir etkisi olmaz. Varsayılan dikey yerçekimi merkezdir (veya merkez_dönüştür) ve üst veya alt olarak değiştirilebilir. Aslında varsayılan layout_gravitydeğer şudur, -1ancak Android bunu dikey olarak ortaya koymaktadır.

Yatay doğrusal bir kapta alt görünümlerin yatay konumlarını değiştirmek için, alt görünümün layout_weightkenar boşluğu ve dolgusu kullanılabilir .

Benzer şekilde, dikey Görünüm Grubu kabı için, alt görünümünün dikey yerçekimi birbirinin altına göre hizalanır ve değiştirilemez. Varsayılan yatay ağırlık merkezdir (veya center_horizontal) ve sola veya sağa değiştirilebilir.

Aslında, düğme gibi bir alt görünümün android:gravityXML özniteliği ve setGravity()alt görünümlerini (içindeki metin) denetleme yöntemi de vardır . Button.setGravity(int)Bu bağlantılıdır developer.android.com girişi .


36

Gönderen ne toplayabilir layout_gravity kendi üst iç görüşündedir yerçekimi ve yerçekimi o görünüme içindeki çocukların yerçekimi.

Bunun doğru olduğunu düşünüyorum ama öğrenmenin en iyi yolu etrafta oynamak.



12

Bir görünümün içindeki içeriğin yerçekimini ayarlamak istiyorsak, o zaman "android: yerçekimi" kullanacağız ve bu görünümün (bir bütün olarak) üst görünümü içinde yerçekimini ayarlamak istiyorsak, "android: layout_gravity".


8

Burada kendi açıklamamı ekleyeceğimi düşündüm - iOS'taki bir arka plandan geliyor, ikisini iOS terimleriyle içselleştirdim: "Düzen Yerçekimi", denetimdeki konumunuzu etkiler. "Yerçekimi", alt görünümlerinizin içinizdeki konumunu etkiler. Başka bir deyişle, Yerçekimi Yerçekimi sizi konumlandırırken yerçekimi çocuklarınızı konumlandırır.


7

Birçok fark vardır gravityve layout-gravity. Bu 2 kavram hakkındaki deneyimlerimi açıklayacağım ( Gözlemim ve bazı web siteleri nedeniyle aldığım tüm bilgiler ).

Yerçekimi ve Yerçekimi Yerçekiminin Kullanımı FrameLayout.....

Not:-

  1. Yerçekimi , bazı Kullanıcıların yanıtı olduğu için İçeriği Görüntüle içinde kullanılır ve herkes için aynıdır ViewGroup Layout.

  2. Layout-gravity , bazı Kullanıcıların cevabı olduğu için üst Görünüm ile kullanılır.

  3. Gravity and Layout-gravityolan eser daha kullanışlı olan FrameLayoutoğul. We can't use Gravity and Layout-gravityFrameLayout Etiketinde ....

  4. Biz herhangi nerede Çocuk Görünüm ayarlayabilirsiniz FrameLayoutkullanarak layout-gravity.

  5. Biz FrameLayout içindeki yerçekimi her değerini kullanabilirsiniz (örn: - center_vertical, center_horizontal, center, top, vs), ancak diğer ViewGroup Düzenleri kullanarak mümkün değildir.

  6. FrameLayouttamamen üzerinde çalışıyor Layout-gravity. Örnek: - Eğer üzerinde çalışıyorsanız FrameLayouto zaman bütün Düzeni değiştirmek gerekmez yeni görünümü eklemek için. Sadece görünümü son olarak son eklerFrameLayout ve ona Layout-gravitydeğer verirsiniz . ( Bu, FrameLayout ile mizanpaj-yerçekiminin avantajlarıdır ).

örnek bakalım ......

<?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>

Çıktı:-

g1

Doğrusal Yerleşimde Yerçekimi ve Yerçekimi Yerçekimi Kullanımı .....

Gravityyukarıdakiyle aynı şekilde çalışıyorum ama burada fark, yerçekimini içimizde LinearLayout Viewve RelativeLayout Viewmümkün olmayan şeylerde kullanabilmemiz FrameLayout View.

Dikey yönlendirmeli LineerLayout ....

Not: - Burada bunun sadece 3 değerini ayarlayabiliriz layout_gravity( left| right| center(ayrıca da denir center_horizontal)).

örnek bakmak: -

<?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>

Çıktı:-

g2

Yatay yönlendirmeli Doğrusal Görünüm ...

Not: - Burada bunun 3 değerini de ayarlayabiliriz layout_gravity( top| bottom| center(ayrıca da denir center_vertical)).

örnek bakmak: -

<?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>

çıktı:-

g3

Not: - Biz kullanamazsınız layout_gravityiçinde RelativeLayout Viewsama biz kullanabilirsiniz gravityseti için RelativeLayout.... aynı pozisyona oğul


1
Eğer textColortümüyle beyaza viewkoyarsanız çok iyi olurdu. : D
Pratik Butani

Emin misiniz? Siyah ve beyaz görünecek, bu yüzden her Görünüm için farklı renk kullandım.
sushildlh

6

Bunu hatırlamanın kolay bir yolu, yerçekimi bizim için geçerlidir. Yani, android:gravityiçindir görünümü.

Rememeber out içinde yatıyordu dışarı _gravity bunu hatırlamak yardımcı olacağınıandroid:layout_gravityifade ediyorum dışında görünümü


5

Sandip'in blogunda neredeyse özlediğim bir şey gördüm, sorunumu düzeltti. Dedi layout_gravityetmez çalışmaları ileLinearLayout .

A kullanıyorsanız LinearLayoutve yerçekimi ayarları sizi deli ediyor (benim gibi), sonra başka bir şeye geçin.

Aslında bir RelativeLayoutsonra kullanılan layout_alignParentLeftve layout_alignParentRight2 içeren TextViews onları sola ve çok sağa gitmek için bir satır almak için geçti.


4

İkisi arasındaki temel fark şudur:

android: yerçekimi görünümün alt öğeleri için kullanılır.

android: layout_gravity bu öğe için ana görünüme göre kullanılır.


3

android:gravity, nesnenin içeriğinin nesnenin içine nasıl yerleştirileceğini belirtmek için kullanılır. Başka bir deyişle, android: yerçekimi, görünümün içeriğinin yerçekimini belirtmek için kullanılır.

android:layout_gravity çocuğun ebeveyn içindeki görüşün yerçekimini belirlemek için ebeveynine sağlayabileceği bir atıftır.

Daha fazla ayrıntı için ziyaret edebilirsiniz

http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html


2
Ben zaten gönderilen ve hemen hemen aynı içerik kapsanan birden fazla cevap var gibi yeni bir cevap gerek düşünüyorum!
Paresh Mayani

3

Yerçekimi: İçeriği bir kabın içine taşımanıza izin verir. (Alt görünümlerin nasıl yerleştirileceği).

Önemli: (Mevcut alanda X ekseni veya Y ekseni boyunca hareket ettirin).

Örnek: Diyelim ki, kök düzeyi öğesi olarak LinearLayout (Yükseklik: match_parent, Width: match_parent) ile çalışacaksanız, tam kare alanınız olacak; ve alt görünümler, LinearLayout içindeki 2 TextViews (Yükseklik: wrap_content, Genişlik: wrap_content), üstteki gravite için karşılık gelen değerler kullanılarak x / y ekseni boyunca hareket ettirilebilir diyor.

Layout_Gravity: yerçekimi davranışını YALNIZCA x ekseni boyunca geçersiz izin verir.

Önemli: (Kullanılabilir alan içindeki X ekseni boyunca [geçersiz kıl].

Örnek: Bir önceki örneği aklınızda tutarsanız, yerçekiminin x / y ekseni boyunca hareket etmemizi sağladığını biliyoruz; TextViews'ı LinearLayout'un içine yerleştirin. Diyelim ki LinearLayout yerçekimini belirtir: center; yani her TextView dikey ve yatay olarak ortalanmalıdır. Şimdi TextView'den birinin sola / sağa gitmesini istiyorsak, TextView üzerinde layout_gravity öğesini kullanarak belirtilen yerçekimi davranışını geçersiz kılabiliriz.

Bonus: Daha derine inerseniz, TextView içindeki metnin alt görünüm olarak hareket ettiğini göreceksiniz; yerçekimini TextView üzerine uygularsanız, TextView içindeki metin hareket eder. (tüm konsept burada da geçerlidir)


1

Yerçekimi görünümlerde metin hizalamasını ayarlamak için kullanılırken, layout_gravity görünümleri kendinden ayarlamak için kullanılır. EditText ile yazılmış metni hizalamak ve sonra gravity'yi kullanmak ve bu editText'i veya herhangi bir düğmeyi veya herhangi bir görünümü hizalamak istiyorsanız, düzen_gravity kullanmak istiyorsanız bir örnek alalım.


1

yerçekimi : metin görünümü, metin düzenleme gibi basit görünümler için kullanılır.

layout_gravity : geçerli görünümde, yalnızca doğrusal Layout veya FrameLayout gibi göreceli üst görünümü bağlamında yerçekimi için veya üst öğesinin merkezinde veya başka bir çekiminde görünüm oluşturmak için kullanılır.


layout_gravity: geçerli görünüm için, üst öğesinin içindeki diğer görünümler için değil, yalnızca göreli üst öğesinin bağlamında yerçekimi için kullanılır.
Chintak Patel

0
android:gravity

görünümün içeriğini, belirtilen konumuna (ayrılmış alan) göre ayarlamak için kullanılır. eşit android:gravity="left" olursa hiçbir şey yapmazlayout_width"wrap_content"

android:layout_gravity 

üst veya düzen dosyasına göre kendisini görüntülemek için kullanılır.


0

android:gravity -> Kullanıldığı Görünüm içeriğinin yerçekimini ayarlar.

android:layout_gravity -> Ebeveynin görüşünün veya Düzeninin yerçekimini ayarlar


0

yerçekimi - Kendi görüşü için geçerlidir.

layout-gravity --- Üst öğe ile ilgili görüntüleme için geçerlidir.


0

Çocukların android:gravityyerçekimini (pozisyonunu) android:layout_gravityayarlarken, görünümün kendisinin pozisyonunu ayarlar. Umarım yardımcı olur

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.