Saya ingin memiliki kotak 2x2 dengan tombol di dalamnya. Ini hanya ICS jadi saya mencoba menggunakan GridLayout baru yang diberikan.
Ini XML layout saya:
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/favorites_grid"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00ff00"
android:rowCount="2"
android:columnCount="2">
<Button
android:text="Cell 0"
android:layout_row="0"
android:layout_column="0"
android:textSize="14dip" />
<Button
android:text="Cell 1"
android:layout_row="0"
android:layout_column="1"
android:textSize="14dip" />
<Button
android:text="Cell 2"
android:layout_row="1"
android:layout_column="0"
android:textSize="14dip" />
<Button
android:text="Cell 3"
android:layout_row="1"
android:layout_column="1"
android:textSize="14dip" />
</GridLayout>
Masalahnya adalah pandangan saya tidak meregang secara merata untuk setiap baris. Ini menyebabkan banyak ruang ekstra di sebelah kanan GridLayout saya.
Saya mencoba pengaturan layout_gravity="fill_horizontal"
tetapi itu hanya berlaku untuk tampilan terakhir di baris. Ini berarti Sel 1 membentang sepanjang jalan untuk memberikan ruang yang cukup untuk Sel 0.
Pikiran tentang cara mengatasi ini?
Jawaban:
UPDATE : Bobot didukung pada API 21. Lihat jawaban PaulT untuk detail lebih lanjut. AKHIR PEMBARUAN Ada batasan saat menggunakan GridLayout, kutipan berikut diambil dari dokumentasi .
Berikut adalah contoh kecil yang menggunakan subview LinearLayout. (Saya menggunakan Space Views yang memakan area yang tidak digunakan dan menekan tombol ke posisi yang diinginkan.)
sumber
Mulai di API 21 gagasan bobot ditambahkan ke GridLayout. Untuk mendukung perangkat Android yang lebih lama, Anda dapat menggunakan GridLayout dari perpustakaan dukungan v7.
XML berikut ini memberikan contoh bagaimana Anda bisa menggunakan bobot untuk mengisi lebar layar.
sumber
FrameLayout
yang berisiButton and an
ImageView` (untuk memiliki ikon overlay pada tombol yang menunjukkan umpan balik visual ketika disentuh ... cerita panjang) sebagai bagian dari keypad. PengaturancolumnWeight
dangravity
pada setiap lainnyaButton
berfungsi dengan baik, tetapi rusak padaFrameLayout
. Meninggalkannya hanya untukFrameLayout
membuat semuanya tampak seperti yang diharapkan.Appcompat21 GridLayout memiliki bobot kolom dan baris yang dapat digunakan seperti di bawah ini untuk secara merata membuat setiap item grid dalam gridlayout seperti gambar di atas.
sumber
compile "com.android.support:gridlayout-v7:$supportVersion"
app:columnCount="2"
):xmlns:app="http://schemas.android.com/apk/lib/android.support.v7.widget.GridLayout"
Mulai di API 21 tanpa pustaka dukungan v7 dengan ScrollView:
XML:
sumber
Anda dapat mengatur lebar setiap anak secara dinamis:
sumber
useDefaultMargins="true"
- bekerja sempurna dengan mereka diatur kefalse
Coba tambahkan berikut ini ke spec GridLayout Anda. Itu seharusnya bekerja.
sumber
Ini adalah jawaban yang benar
sumber
Saya akhirnya menemukan solusinya. Seperti yang dikatakan Rotemmiz, Anda harus melakukannya secara dinamis sesudahnya. Kode ini merentangkan tombol untuk mengisi tampilan secara horizontal, tetapi hal yang sama dapat dilakukan untuk vertikal.
(Ke 20 untuk padding dan margin internal dan eksternal. Ini bisa dilakukan lebih universal, tapi ini jauh lebih bersih)
Maka bisa disebut seperti ini:
Itu harus dilakukan dengan pengamat karena kita perlu menunggu sampai gambarnya diambil sebelum kita memanggil pandangan.
sumber
Dalam kasus saya, saya menambahkan tombol secara dinamis sehingga solusi saya memerlukan beberapa bagian XML dan beberapa bagian Java. Saya harus menemukan dan mencampur solusi dari beberapa tempat yang berbeda dan berpikir saya akan membagikannya di sini sehingga orang lain yang mencari solusi yang sama mungkin merasa terbantu.
Bagian pertama dari file layout XML saya ...
grid:useDefaultMargins="true"
tidak diperlukan tetapi saya menambahkan karena itu terlihat lebih baik bagi saya, Anda dapat menerapkan efek visual lainnya (misalnya bantalan) seperti yang disebutkan dalam beberapa jawaban di sini. Sekarang untuk tombol karena saya harus menambahkannya secara dinamis. Ini adalah bagian Java dari kode saya untuk membuat tombol-tombol ini, saya hanya menyertakan baris-baris yang terkait dengan konteks ini. Asumsikan saya harus membuat tombol karena banyakmyOptions
tersedia untuk kode saya dan saya tidak menyalin kode OnClickListener juga.Karena kami menggunakan GridLayout dari pustaka dukungan dan bukan GridLayout standar, kami harus memberi tahu nilai tentang itu dalam
YourProject.grade
file.sumber
Anda dapat membuat ini lebih cepat dengan mengganti metode onLayout ViewGroup. Ini adalah solusi universal saya:
EDIT: Jangan lupa match_parent untuk anak-anak!
sumber
getChildAt(i).layout(viewWidth * columnIndex + margin, viewHeight * rowIndex + margin, viewWidth * columnIndex + viewWidth - margin, viewHeight * rowIndex + viewHeight - margin);
Solusi terbaik yang bisa saya temukan adalah dengan menggunakan tata letak linear (horizontal) untuk setiap baris yang Anda inginkan dan di dalamnya tetapkan lebar tombol (sel) ke 0dp dan bobot ke 1. Untuk setiap tata letak linier (baris) tetapkan ketinggian ke 0dp dan bobot ke 1. Temukan kode di bawah ini - juga android: layout_gravity = "center_vertical" digunakan untuk menyelaraskan tombol dalam satu baris jika mengandung teks panjang variabel. Penggunaan 0dp dan berat itu trik yang cukup rapi namun tidak begitu terkenal.
sumber
Anda disini:
sumber
Saya ingin memiliki tabel terpusat dengan label kanan selaras dan nilai kiri selaras. Ruang ekstra harus di sekitar meja. Setelah banyak bereksperimen dan tidak mengikuti apa yang harus dilakukan oleh dokumentasi, saya menemukan sesuatu yang berhasil. Inilah yang saya lakukan:
Ini tampaknya berhasil tetapi GridLayout menunjukkan pesan:
"Layout GridLayout ini atau orang tua LinearLayout tidak berguna"
Tidak yakin mengapa itu "tidak berguna" ketika itu bekerja untuk saya.
Saya tidak yakin mengapa ini berhasil atau jika ini adalah ide yang bagus, tetapi jika Anda mencobanya dan dapat memberikan ide yang lebih baik, sedikit peningkatan atau menjelaskan mengapa ini berhasil (atau tidak akan berhasil), saya akan menghargai umpan baliknya.
Terima kasih.
sumber
Ini adalah pertanyaan yang cukup lama, tetapi jelas menarik bagi banyak orang. Untuk tata letak sederhana dari 4 tombol seperti ini, tampaknya TableLayout adalah cara termudah untuk mencapai hasil yang diinginkan.
Berikut ini beberapa contoh kode yang menunjukkan 2 baris pertama tabel dengan 6 kolom yang mencakup lebar induknya. LinearLayout dan ImageView di setiap sel digunakan untuk memungkinkan "menghidupkan dan mematikan" suatu gambar di dalam sel sementara warna sel tetap ada.
sumber
Pertanyaan lama, tetapi ingin menambahkan solusi saya. Saya membuat "layout grid linear" yang mensimulasikan grid tetapi menggunakan layout linear bersarang. Ini memungkinkannya meregang untuk mengisi ruang.
sumber
Saya berharap ini membantu seseorang
Hasil
Kode:
sumber
Hasil:
Coba sesuatu seperti ini:
Jika Anda ingin lebar dan tinggi spesifik untuk sel Anda, maka gunakan:
sumber
Ini adalah kode untuk aplikasi standar yang lebih banyak tanpa tombol, ini sangat berguna bagi saya
sumber
saya memiliki masalah yang sama dan saya pikir hanya mengatur lebar dan tinggi secara terprogram:
atur lebar tombol dengan metrics.widthPixels / 2 metrik adalah objek DisplayMetrics.
sumber
Anda dapat menemukan seluruh tutorial di sini, Tata Letak Kotak Android Dengan CardView dan OnItemClickListener
sumber
Inilah yang saya lakukan dan saya senang mengatakan bahwa ini berhasil untuk saya. Saya juga ingin kotak item 2x2, 3x3 dll untuk menutupi seluruh layar. Pemutaran kisi tidak mematuhi lebar layar. Jenis pekerjaan LinearLayouts tetapi Anda tidak dapat menggunakan bobot bersarang.
Pilihan terbaik bagi saya adalah menggunakan Fragmen. Saya menggunakan tutorial ini untuk memulai dengan apa yang ingin saya lakukan.
Ini beberapa kode:
Aktifitas utama:
activity_main_6 XML (mengembang 3 fragmen)
Tata letak fragmen dasar
Kelas Fragmen (hanya menangani inisialisasi tampilan khusus) mengembang 2 ubin per fragmen
}
Itu dia!
Ini adalah pekerjaan aneh untuk menggunakan bobot bersarang, pada dasarnya. Ini memberi saya grid 2x3 sempurna yang mengisi seluruh layar tablet 10 inci dan DNA droid HTC saya. Biarkan saya tahu bagaimana hasilnya untuk Anda!
sumber