Saya mencoba menggunakan Design TabLayout baru dalam proyek saya. Saya ingin tata letaknya beradaptasi dengan setiap ukuran dan orientasi layar, tetapi tata letaknya dapat dilihat dengan benar dalam satu orientasi.
Saya berurusan dengan Gravity dan Mode yang mengatur tabLayout saya sebagai:
tabLayout.setTabGravity(TabLayout.GRAVITY_CENTER);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
Jadi saya harapkan kalau tidak ada ruang, tabLayout bisa di-scroll, tapi kalau ada ruang, itu tengah.
Dari panduan:
GRAVITY_CENTER Gravity public int static final digunakan untuk meletakkan tab di tengah TabLayout.
GRAVITY_FILL public int static final digunakan untuk mengisi TabLayout sebanyak mungkin. Opsi ini hanya berlaku jika digunakan dengan MODE_FIXED.
MODE_FIXED public int static final Tab tetap menampilkan semua tab secara bersamaan dan paling baik digunakan dengan konten yang diuntungkan dari pivot cepat antar tab. Jumlah maksimum tab dibatasi oleh lebar tampilan. Tab tetap memiliki lebar yang sama, berdasarkan label tab terluas.
MODE_SCROLLABLE public int static final Tab scrollable menampilkan subset tab pada saat tertentu, dan dapat berisi label tab yang lebih panjang dan lebih banyak tab. Mereka paling baik digunakan untuk menjelajahi konteks di antarmuka sentuh saat pengguna tidak perlu membandingkan label tab secara langsung.
Jadi GRAVITY_FILL hanya kompatibel dengan MODE_FIXED tetapi, di tidak menentukan apa pun untuk GRAVITY_CENTER, saya berharap ini kompatibel dengan MODE_SCROLLABLE, tetapi inilah yang saya dapatkan dengan menggunakan GRAVITY_CENTER dan MODE_SCROLLABLE
Jadi ini menggunakan SCROLLABLE di kedua orientasi, tetapi tidak menggunakan GRAVITY_CENTER.
Inilah yang saya harapkan untuk lanskap; tetapi untuk memiliki ini, saya perlu mengatur MODE_FIXED, jadi yang saya dapatkan dalam potret adalah:
Mengapa GRAVITY_CENTER tidak berfungsi untuk SCROLLABLE jika tabLayout pas dengan layar? Apakah ada cara untuk mengatur gravitasi dan mode secara dinamis (dan untuk melihat apa yang saya harapkan)?
Terima kasih banyak!
DIEDIT: Ini adalah Tata Letak TabLayout saya:
<android.support.design.widget.TabLayout
android:id="@+id/sliding_tabs"
android:layout_width="match_parent"
android:background="@color/orange_pager"
android:layout_height="wrap_content" />
sumber
Jawaban:
Efek hanya gravitasi tab
MODE_FIXED
.Salah satu solusi yang mungkin adalah menyetel
layout_width
kewrap_content
danlayout_gravity
kecenter_horizontal
:Jika tab lebih kecil dari lebar layar, maka tab
TabLayout
itu sendiri juga akan lebih kecil dan akan dipusatkan karena gravitasi. Jika tab lebih besar dari lebar layar, makaTabLayout
akan cocok dengan lebar layar dan pengguliran akan aktif.sumber
app:tabMaxWidth="0dp"
danandroid:layout_centerHorizontal="true"
bekerja ke tab tengah.ini adalah bagaimana saya melakukannya
TabLayout.xml
Oncreate
Saya membuat perubahan kecil pada solusi @Mario Velasco di bagian yang dapat dijalankan
sumber
tabLayout.getWidth()
selalu mengembalikan nol untukkumembuat semuanya tetap sederhana cukup tambahkan app: tabMode = "scrollable" dan android: layout_gravity = "bottom"
seperti ini
sumber
Karena saya tidak menemukan mengapa perilaku ini terjadi, saya telah menggunakan kode berikut:
Pada dasarnya, saya harus menghitung secara manual lebar tabLayout saya dan kemudian saya mengatur Mode Tab tergantung pada apakah tabLayout cocok di perangkat atau tidak.
Alasan mengapa saya mendapatkan ukuran layout secara manual adalah karena tidak semua tab memiliki lebar yang sama dalam mode Scrollable, dan ini bisa memancing beberapa nama menggunakan 2 baris seperti yang terjadi pada saya di contoh.
sumber
Lihat android-tablayouthelper
sumber
Ini adalah solusi yang saya gunakan untuk secara otomatis mengubah antara
SCROLLABLE
danFIXED
+FILL
. Ini adalah kode lengkap untuk solusi @ Fighter42:(Kode di bawah ini menunjukkan di mana harus meletakkan modifikasi jika Anda telah menggunakan templat aktivitas tab Google)
Tata Letak:
Jika Anda tidak perlu mengisi lebar, lebih baik gunakan solusi @karaokyo.
sumber
Saya membuat kelas AdaptiveTabLayout untuk mencapai ini. Ini adalah satu-satunya cara yang saya temukan untuk benar-benar memecahkan masalah, menjawab pertanyaan dan menghindari / mengatasi masalah yang tidak dapat dilakukan oleh jawaban lain di sini.
Catatan:
MODE_SCROLLABLE
tetapi tidak cukup ruang untuk ituMODE_FIXED
. Jika Anda tidak menangani kasus ini, ini akan terjadi pada beberapa perangkat Anda akan melihat ukuran teks yang berbeda atau oven dua baris teks di beberapa tab, yang terlihat buruk.wrap_content
pada xml. Jangan setel mode atau gravitasi apa pun pada xml.AdaptiveTabLayout.java
Dan ini adalah kelas DeviceUtils:
Gunakan contoh:
Inti
Masalah / Minta bantuan:
Logcat:
Saya tidak yakin bagaimana mengatasinya. Ada saran?
sumber
sumber
Contoh yang sangat sederhana dan selalu berhasil.
sumber
Ini adalah satu-satunya kode yang berhasil untuk saya:
DisplayMetrics dapat diambil menggunakan ini:
Dan XML TabLayout Anda akan terlihat seperti ini (jangan lupa untuk menyetel tabMaxWidth ke 0):
sumber
Yang Anda butuhkan hanyalah menambahkan yang berikut ini ke TabLayout Anda
Jadi, Anda akan memiliki:
sumber
Saya menyelesaikan ini menggunakan berikut
sumber
Solusi terakhir saya
sumber