Apa perbedaan antara gravitasi dan layout_gravity di Android?

1329

Saya tahu kami dapat mengatur nilai berikut ke android:gravitydan android:layout_gravityproperti:

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

Tapi saya bingung tentang keduanya.

Apa perbedaan antara penggunaan android:gravitydan android:layout_gravity?

Paresh Mayani
sumber
265
Trik mudah untuk diingat: Ambil "tata ruang-gravitasi" sebagai "Tata ruang-luar-gravitasi"
Wisnu Haridas
6
center == center_vertical | center_horizontal
Yousha Aleayoub
4
Video-video ini banyak membantu saya untuk memahami perbedaannya: youtube.com/watch?v=DxfYeAUd238 youtube.com/watch?v=1FyAIWLVcTc
Roni Castro
ImageViewTampaknya berperilaku berbeda dari TextView.
samis

Jawaban:

1347

Nama mereka akan membantu Anda:

  • android:gravitymengatur gravitasi konten (yaitu subview) dari konten Viewyang digunakan.
  • android:layout_gravitymengatur gravitasi Viewatau Layoutrelatif terhadap induknya.

Dan sebuah contoh ada di sini .

Sephy
sumber
88
Pada dasarnya, segala sesuatu dengan layout_mendefinisikan sesuatu yang mempengaruhi elemen di luar.
Triang3l
29
Lihat, saya menemukan ini lucu, karena jika saya hanya pergi dari nama, intuisi saya adalah sebaliknya. Setiap kali, saya pikir "layout_gravity" berarti "gravitasi untuk bagaimana ViewGroup ini menjabarkan isinya", dan "gravitasi" adalah "di mana tampilan ini tertarik".
Ogre
15
Jadi apa yang terjadi jika android:gravitydiatur ke kiri dan anak-anaknya android:layout_gravitydiatur ke kanan? sisi mana anak-anak akan bersekutu?
Thupten
2
Ketika @Suragch mengomentari jawabannya, layout_gravity hanya berfungsi di LinearLayout dan FrameLayout. LinearLayout memiliki kendala untuk itu.
Marco Luglio
1
@Thupten Pertanyaan yang sangat bagus. Saya kira satu akan menang (saya kira layout_gravity anak-anak) dan yang lainnya hanya default untuk yang berlaku.
Trilarion
523

Di dalam di luar

  • gravitymengatur konten di dalam tampilan.
  • layout_gravitymengatur posisi tampilan di luar dirinya sendiri.

Terkadang membantu melihat gambar juga. Hijau dan biru TextViewsdan dua warna latar belakang lainnya LinearLayouts.

masukkan deskripsi gambar di sini

Catatan

  • Tidak layout_gravityberfungsi untuk tampilan dalam a RelativeLayout. Gunakan untuk tampilan dalam LinearLayoutatau FrameLayout. Lihat jawaban tambahan saya untuk lebih jelasnya.
  • Lebar tampilan (atau tinggi) harus lebih besar dari kontennya. Kalau gravitytidak, tidak akan memiliki efek apa pun. Dengan demikian, wrap_contentdan gravitytidak ada artinya bersama.
  • Lebar tampilan (atau tinggi) harus lebih kecil dari induknya. Kalau layout_gravitytidak, tidak akan memiliki efek apa pun. Dengan demikian, match_parentdan layout_gravitytidak ada artinya bersama.
  • The layout_gravity=centerterlihat sama seperti layout_gravity=center_horizontaldi sini karena mereka berada dalam tata letak linear vertikal. Anda tidak dapat memusatkan secara vertikal dalam hal ini, jadi layout_gravity=centerhanya memusatkan secara horizontal.
  • Jawaban ini hanya berurusan dengan pengaturan gravitydan layout_gravitytampilan dalam tata letak. Untuk melihat apa yang terjadi ketika Anda mengatur gravitytata letak induk itu sendiri, periksa jawaban tambahan yang saya sebutkan di atas. (Ringkasan: gravitytidak berfungsi dengan baik pada RelativeLayouttetapi dapat berguna dengan a LinearLayout.)

Jadi ingat, tata letak _gravity mengatur tampilan dalam tata letaknya . Gravity mengatur konten di dalam tampilan.

xml

Berikut ini adalah xml untuk gambar di atas untuk referensi Anda:

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

Terkait

Suragch
sumber
rasanya lebih mudah setelah melihatnya secara visual, terima kasih Suragch.
Haritsinh Gohil
467

Perbedaan

android:layout_gravityadalah Gravitasi Luar Pandangan. Menentukan arah di mana Tampilan harus menyentuh batas induknya.

android:gravityadalah Gravitasi Di Dalam Pandangan itu. Menentukan ke arah mana kontennya harus disejajarkan.

Setara HTML / CSS

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

Trik mudah untuk membantu Anda mengingat

Ambil layout-gravitysebagai "Lay-outside-gravity".

Wisnu Haridas
sumber
lebih masuk akal bila Anda memiliki latar belakang pengembangan web.
Haritsinh Gohil
41

Jawaban Singkat: gunakan android:gravityatau setGravity()untuk mengontrol gravitasi semua pandangan anak tentang suatu wadah; gunakan android:layout_gravityatausetLayoutParams() untuk mengontrol gravitasi pandangan individu dalam sebuah wadah.

Panjang cerita: untuk mengontrol gravitasi dalam wadah tata letak linier seperti LinearLayoutatauRadioGroup , ada dua pendekatan:

1) Untuk mengontrol gravitasi SEMUA tampilan anak dari suatu LinearLayoutwadah (seperti yang Anda lakukan dalam buku Anda), gunakan android:gravity(bukan android:layout_gravity) dalam tata letak file XML atausetGravity() metode dalam kode.

2) Untuk mengontrol gravitasi tampilan anak dalam wadahnya, gunakan android:layout_gravityatribut XML. Dalam kode, kita perlu mendapatkan LinearLayout.LayoutParamstampilan dan mengatur gravitasinya. Berikut adalah contoh kode yang mengatur tombol ke bawah dalam wadah yang berorientasi horizontal:

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

Untuk LinearLayoutwadah horisontal , gravitasi horizontal dari tampilan anaknya disejajarkan satu demi satu dan tidak dapat diubah. Pengaturan android:layout_gravityuntuk center_horizontaltidak berpengaruh. Gravitasi vertikal default adalah pusat (atau center_vertical) dan dapat diubah ke atas atau bawah. Sebenarnya nilai default layout_gravityadalah -1tetapi Android meletakkannya di tengah secara vertikal.

Untuk mengubah posisi horisontal pandangan anak dalam wadah linier horisontal, orang dapat menggunakan layout_weight, margin dan bantalan tampilan anak.

Demikian pula, untuk wadah Grup Tampilan vertikal, gravitasi vertikal tampilan anaknya disejajarkan satu di bawah yang lain dan tidak dapat diubah. Gravitasi horisontal default adalah tengah (atau center_horizontal) dan dapat diubah ke kiri atau kanan.

Sebenarnya, tampilan anak seperti tombol juga memiliki android:gravityatribut XML dan setGravity()metode untuk mengontrol tampilan anaknya - teks di dalamnya. Ini Button.setGravity(int)terkait dengan entri developer.android.com ini .

Ying
sumber
36

Dari apa yang saya dapat kumpulkan layout_gravity adalah gravitasi pandangan itu di dalam induknya, dan gravitasi adalah gravitasi anak-anak di dalam pandangan itu.

Saya pikir ini benar tetapi cara terbaik untuk mengetahuinya adalah dengan bermain-main.

matto1990
sumber
29

Lihatlah gambar untuk lebih jelas tentang gravitasi

Akshay Paliwal
sumber
12

Jika a kita ingin mengatur gravitasi konten di dalam tampilan maka kita akan menggunakan "android: gravity", dan jika kita ingin mengatur gravitasi tampilan ini (secara keseluruhan) dalam tampilan induknya maka kita akan menggunakan "android: layout_gravity ".

Abhishek Tamta
sumber
8

Saya pikir saya akan menambahkan penjelasan saya sendiri di sini - berasal dari latar belakang di iOS, ini adalah bagaimana saya menginternalisasi keduanya dalam istilah iOS: "Layout Gravity" memengaruhi posisi Anda di superview. "Gravity" memengaruhi posisi subview Anda di dalam diri Anda. Dengan kata lain, Gravitasi Tata Letak memposisikan Anda sendiri sementara gravitasi memposisikan anak-anak Anda.

mszaro
sumber
7

Ada banyak perbedaan dalam gravitydan layout-gravity. Saya akan menjelaskan pengalaman saya tentang 2 konsep ini ( Semua informasi yang saya dapatkan karena pengamatan saya dan beberapa situs web ).

Penggunaan Gravity dan Layout-gravity dalam FrameLayout.....

Catatan:-

  1. Gravitasi digunakan di dalam Konten Tampilan karena sebagian Pengguna memiliki jawaban dan sama untuk semua ViewGroup Layout.

  2. Layout-gravity digunakan dengan Tampilan induk karena sebagian Pengguna memiliki jawaban.

  3. Gravity and Layout-gravityadalah pekerjaan lebih bermanfaat dengan FrameLayoutanak - anaknya. We can't use Gravity and Layout-gravitydalam Tag FrameLayout ....

  4. Kita dapat mengatur Tampilan Anak di mana saja di FrameLayout menggunakan layout-gravity.

  5. Kita dapat menggunakan setiap nilai tunggal gravitasi di dalam FrameLayout (misalnya: - center_vertical, center_horizontal,center , top, dll), tetapi tidak mungkin dengan Layout ViewGroup lainnya.

  6. FrameLayoutsepenuhnya bekerja Layout-gravity. Contoh: - Jika Anda bekerja FrameLayoutmaka Anda tidak perlu mengubah seluruh Tata Letak untuk menambahkan Tampilan baru. Anda cukup menambahkan View sebagai yang terakhir di FrameLayoutdan memberinya Layout-gravitynilai. ( Ini adalah tambahan tata letak-gravitasi dengan FrameLayout ).

lihat contohnya ......

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

Keluaran:-

g1

Penggunaan Gravity dan Layout-gravity dalam LinearLayout .....

Gravitybekerja sama seperti di atas tetapi di sini perbedaannya adalah bahwa kita dapat menggunakan Gravity di dalam LinearLayout ViewdanRelativeLayout View yang tidak mungkin di FrameLayout View.

LinearLayout dengan orientasi vertikal ....

Catatan: - Di sini kita hanya dapat menetapkan 3 nilai layout_gravityyaitu ( left| right| center(juga disebut center_horizontal)).

lihat contoh: -

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

Keluaran:-

g2

LinearLayout dengan orientasi horizontal ....

Catatan: - Di sini kita dapat mengatur juga 3 nilai layout_gravityyaitu ( top| bottom| center(juga disebut center_vertical)).

lihat contoh: -

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

keluaran:-

g3

Catatan: - Kita tidak dapat menggunakan layout_gravitydalam RelativeLayout Viewstetapi kita dapat menggunakan gravityuntuk mengatur RelativeLayoutanak-anak ke posisi yang sama ....

sushildlh
sumber
1
Jika Anda mengatur textColorputih semua viewmaka itu akan sangat bagus. : D
Pratik Butani
Apakah kamu yakin Itu akan terlihat hitam dan putih itu sebabnya saya menggunakan warna yang berbeda untuk setiap tampilan.
sushildlh
6

Trik yang mudah diingat adalah gravitasi berlaku bagi kita di dalam bumi. Jadi, android:gravityuntuk dalam dalam tampilan.

Rememeber keluar di lay out _gravity yang akan membantu Anda untuk mengingat bahwa android:layout_gravityakan merujuk ke luar pandangan

Mahendra Liya
sumber
5

Sesuatu yang saya lihat di blog Sandip yang hampir saya lewatkan, memperbaiki masalah saya. Dia berkata layout_gravityJANGAN BEKERJA DENGANLinearLayout .

Jika Anda menggunakan LinearLayout dan pengaturan gravitasi membuat Anda gila (seperti saya), maka beralihlah ke sesuatu yang lain.

Saya benar-benar beralih ke yang RelativeLayoutkemudian digunakan layout_alignParentLeftdan layout_alignParentRightpada 2 berisi TextViewuntuk membuat mereka pada satu baris untuk pergi paling kiri dan paling kanan.

JustSomeGuy
sumber
4

Perbedaan mendasar antara keduanya adalah bahwa-

android: gravitasi digunakan untuk elemen tampilan anak.

android: layout_gravity digunakan untuk elemen ini sehubungan dengan tampilan induk.

Abhishek T.
sumber
3

android:gravitydigunakan untuk menentukan cara menempatkan konten objek di dalam objek itu sendiri. Dengan kata lain, android: gravity digunakan untuk menentukan gravitasi konten tampilan.

android:layout_gravity adalah atribusi yang dapat diberikan anak kepada orang tuanya, untuk menentukan gravitasi pandangan di dalam orang tuanya.

Untuk detail lebih lanjut, Anda dapat mengunjungi

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

IntelliJ Amiya
sumber
2
Saya pikir tidak perlu jawaban baru karena sudah ada beberapa jawaban yang sudah diposting dan dengan konten yang hampir sama tercakup!
Paresh Mayani
3

Gravitasi: Memungkinkan Anda memindahkan konten di dalam sebuah wadah. (Bagaimana sub-tampilan akan ditempatkan).

Penting: (PINDAHKAN sepanjang sumbu X atau sumbu Y dalam ruang yang tersedia).

Contoh: Katakanlah jika Anda bekerja dengan LinearLayout (Tinggi: match_parent, Lebar: match_parent) sebagai elemen level root, maka Anda akan memiliki ruang bingkai penuh yang tersedia; dan tampilan anak mengatakan 2 TextViews (Tinggi: wrap_content, Lebar: wrap_content) di dalam LinearLayout dapat dipindahkan di sepanjang sumbu x / y menggunakan nilai yang sesuai untuk gravitasi pada induk.

Layout_Gravity: Memungkinkan Anda untuk mengesampingkan perilaku gravitasi induk HANYA sepanjang sumbu x.

Penting: (PINDAHKAN [override] sepanjang sumbu X dalam ruang yang tersedia).

Contoh: Jika Anda ingat contoh sebelumnya, kita tahu gravitasi memungkinkan kita untuk bergerak sepanjang sumbu x / y, yaitu; tempat TextViews di dalam LinearLayout. Anggap saja LinearLayout menentukan gravitasi: pusat; artinya setiap TextView harus berada di tengah, baik secara vertikal maupun horizontal. Sekarang jika kita ingin salah satu TextView ke kiri / kanan, kita dapat mengganti perilaku gravitasi yang ditentukan menggunakan layout_gravity pada TextView.

Bonus: jika Anda menggali lebih dalam, Anda akan menemukan teks itu di dalam tindakan TextView sebagai sub-tampilan; jadi jika Anda menerapkan gravitasi pada TextView, teks di dalam TextView akan bergerak. (seluruh konsep juga berlaku di sini)

Ali Raza
sumber
1

Gravity digunakan untuk mengatur perataan teks dalam tampilan tetapi layout_gravity digunakan untuk mengatur tampilan itu sendiri. Mari kita ambil contoh jika Anda ingin menyelaraskan teks yang ditulis dalam editText kemudian gunakan gravitasi dan Anda ingin menyelaraskan ini editText atau tombol apa pun atau tampilan apa pun kemudian gunakan layout_gravity, Jadi sangat sederhana.

Praveen Gaur
sumber
1

gravitasi : digunakan untuk tampilan sederhana seperti tampilan teks, edittext dll.

layout_gravity : digunakan untuk tampilan saat ini hanya gravitasi dalam konteks tampilan induk relatifnya seperti Layout linear atau FrameLayout untuk membuat tampilan di tengah atau gravitasi lain dari induknya.

Mayank Garg
sumber
layout_gravity: digunakan untuk gravitasi saat ini hanya tampilan dalam konteks orang tua relatifnya, bukan pandangan lain yang ada di dalam orang tua itu.
Chintak Patel
0
android:gravity

digunakan untuk menyesuaikan konten tampilan relatif ke posisi yang ditentukan (area yang dialokasikan). android:gravity="left" tidak akan melakukan apa pun jika layout_widthsama dengan"wrap_content"

android:layout_gravity 

digunakan untuk tampilan itu sendiri relatif terhadap file induk atau tata letak.

Tulsi
sumber
0

android:gravity -> Mengatur gravitasi konten Tampilan yang digunakan.

android:layout_gravity -> Mengatur gravitasi tampilan atau Layout Orangtua itu

Vamsi
sumber
0

gravitasi - Berlaku untuk pandangannya sendiri.

layout-gravity --- Berlaku untuk melihat yang terkait dengan induknya.

nidhi
sumber
0

Yang android:gravitymengatur gravitasi (posisi) anak-anak sedangkan yang android:layout_gravitymengatur posisi pandangan itu sendiri. Semoga ini bisa membantu

Joel
sumber