Bilah navigasi hitam di bagian bawah layar tidak mudah dilepas di Android. Ini telah menjadi bagian dari Android sejak 3.0 sebagai pengganti tombol perangkat keras. Ini gambarnya:
Bagaimana saya bisa mendapatkan ukuran lebar dan tinggi elemen UI ini dalam piksel?
Jawaban:
Coba kode di bawah ini:
sumber
navigation_bar_height_landscape
untuk tinggi bilah navigasi dalam mode lanskap, dannavigation_bar_width
untuk lebar bilah navigasi vertikal). Anda harus mencari tahu secara terpisah jika dan di mana bilah navigasi benar-benar ditampilkan, misalnya dengan menguji keberadaan tombol menu fisik. Mungkin Anda dapat menemukan cara lain dalam kode sumber Android di android.googlesource.com/platform/frameworks/base/+/…Saya mendapatkan ukuran bilah navigasi dengan membandingkan ukuran layar yang dapat digunakan aplikasi dengan ukuran layar sebenarnya. Saya berasumsi bahwa bilah navigasi ada saat ukuran layar yang dapat digunakan aplikasi lebih kecil dari ukuran layar sebenarnya. Kemudian saya menghitung ukuran bilah navigasi. Metode ini berfungsi dengan API 14 dan yang lebih baru.
MEMPERBARUI
Untuk solusi yang memperhitungkan guntingan tampilan, silakan periksa jawaban John .
sumber
Tinggi NavigationBar bervariasi untuk beberapa perangkat, tetapi juga untuk beberapa orientasi. Pertama Anda harus memeriksa apakah perangkat tersebut memiliki navbar, kemudian apakah perangkat tersebut adalah tablet atau bukan tablet (ponsel) dan terakhir Anda harus melihat orientasi perangkat untuk mendapatkan ketinggian yang benar.
sumber
hasBackKey = false!
meskipun seharusnya benar. Yang berikut ini berhasil:boolean navBarExists = getResources().getBoolean(getResources().getIdentifier("config_showNavigationBar", "bool", "android"));
Sebenarnya bilah navigasi di tablet (setidaknya Nexus 7) memiliki ukuran potret dan lanskap yang berbeda sehingga fungsi ini akan terlihat seperti ini:
sumber
context.getResources().getConfiguration().orientation
Saya pikir jawaban yang lebih baik ada di sini karena memungkinkan Anda untuk mendapatkan ketinggian potongan yang rata juga.
Ambil tampilan root Anda, dan tambahkan setOnApplyWindowInsetsListener (atau Anda dapat mengganti onApplyWindowInsets darinya), dan mengambil insets.getSystemWindowInsets darinya.
Dalam aktivitas kamera saya, saya menambahkan padding yang sama dengan systemWindowInsetBottom ke tata letak bawah saya. Dan akhirnya, memperbaiki masalah guntingan.
dengan appcompat seperti ini
tanpa appcompat, ini:
sumber
setOnApplyWindowInsetsListener
sebagai gantinya? Jika ya, bagaimana caranya? dan mengapa Anda membedakan antara LOLLIPOP dan yang lainnya?Saya harap ini membantu Anda
sumber
Ini adalah kode saya untuk menambahkan paddingRight dan paddingBottom ke View untuk menghindari Navigation Bar. Saya menggabungkan beberapa jawaban di sini dan membuat klausa khusus untuk orientasi lanskap bersama dengan isInMultiWindowMode. Kuncinya adalah membaca navigation_bar_height , tetapi juga memeriksa config_showNavigationBar untuk memastikan kita benar-benar harus menggunakan ketinggian.
Tidak ada solusi sebelumnya yang berhasil untuk saya. Pada Android 7.0 Anda harus mempertimbangkan Multi Window Mode. Ini memecah implementasi yang membandingkan display.realSize dengan display.size karena realSize memberi Anda dimensi seluruh layar (baik jendela terpisah) dan ukuran hanya memberi Anda dimensi dari jendela Aplikasi Anda. Menyetel padding ke perbedaan ini akan membuat seluruh tampilan Anda menjadi padding.
sumber
Tinggi bilah Navigasi bawah adalah 48 dp (dalam mode potret dan lanskap) dan 42 dp saat bilah ditempatkan secara vertikal.
sumber
Solusi yang diusulkan oleh Egidijus dan bekerja dengan sempurna untuk Build.VERSION.SDK_INT> = 17
Tetapi saya mendapatkan "NoSuchMethodException" selama eksekusi pernyataan berikut dengan Build.VERSION.SDK_INT <17 di perangkat saya:
Saya telah mengubah metode getRealScreenSize () untuk kasus seperti ini:
sumber
Saya menyelesaikan masalah ini untuk semua perangkat (termasuk Nexus 5, Samsung Galaxy Nexus 6 edge +, Samsung S10, Samsung Note II dll.). Saya pikir ini akan membantu Anda menangani masalah yang bergantung pada perangkat.
Di sini saya menambahkan dua jenis kode,
Kode Java (untuk Android Asli):
Dan kode C # (untuk Xamarin Forms / Android)
sumber
Display.getRealMetrics()
membutuhkan API level 17screenOrientation
adalah default,hasPermanentMenuKey
adalahfalse
hanya jika tidak rotate. [2] SaatscreenOrientation
lanskap, ia jatuh ke dalam lanskapdisplayMetrics.heightPixels != realDisplayMetrics.heightPixels)
lain. [3] SaatscreenOrientation
sedang potret,hasPermanentMenuKey
adalahfalse
.Menggabungkan jawaban dari @egis dan lainnya - ini berfungsi dengan baik pada berbagai perangkat, diuji pada Pixel EMU, Samsung S6, Sony Z3, Nexus 4. Kode ini menggunakan dimensi tampilan untuk menguji ketersediaan bilah navigasi dan kemudian menggunakan yang sebenarnya ukuran bilah navigasi sistem jika ada.
sumber
Cara mendapatkan ketinggian bilah navigasi dan bilah status. Kode ini berfungsi untuk saya di beberapa perangkat Huawei dan perangkat Samsung . Solusi Egis di atas bagus, namun masih salah di beberapa perangkat. Jadi, saya memperbaikinya.
Ini adalah kode untuk mendapatkan ketinggian bilah status
Metode ini selalu mengembalikan ketinggian bilah navigasi bahkan saat bilah navigasi disembunyikan.
CATATAN: pada Samsung A70, metode ini mengembalikan tinggi bilah status + tinggi bilah navigasi. Di perangkat lain (Huawei), ini hanya mengembalikan tinggi bilah Navigasi dan mengembalikan 0 ketika bilah navigasi disembunyikan.
Ini adalah kode untuk mendapatkan ketinggian bilah navigasi dan bilah status
sumber
Saya telah melakukan ini, ini berfungsi pada setiap perangkat yang saya uji, dan bahkan pada emulator:
sumber
Inilah cara saya menyelesaikan ini. Saya membuat bilah bawah yang dapat disembunyikan yang membutuhkan bantalan tergantung pada apakah ada bilah navigasi atau tidak (kapasitif, di layar atau hanya pra lollipop).
Melihat
Utils.java
sumber
Dalam kasus saya di mana saya ingin memiliki sesuatu seperti ini:
Saya harus mengikuti hal yang sama seperti yang disarankan oleh @Mdlc tetapi mungkin sedikit lebih sederhana ( hanya menargetkan > = 21):
Ini berfungsi pada lanskap juga:
Edit Solusi di atas tidak berfungsi dengan benar dalam mode multi-jendela di mana persegi panjang yang dapat digunakan tidak lebih kecil hanya karena bilah navigasi tetapi juga karena ukuran jendela khusus. Satu hal yang saya perhatikan adalah bahwa di multi-jendela bilah navigasi tidak melayang di atas aplikasi sehingga bahkan tanpa perubahan pada padding DecorView kami memiliki perilaku yang benar:
Perhatikan perbedaan antara bagaimana bilah navigasi mengarahkan kursor ke bawah aplikasi dalam skenario ini. Untungnya, ini mudah diperbaiki. Kami dapat memeriksa apakah aplikasi multi jendela. Kode di bawah ini juga menyertakan bagian untuk menghitung dan mengatur posisi toolbar (solusi lengkap: https://stackoverflow.com/a/14213035/477790 )
Hasil pada mode popup Samsung:
sumber
Kode yang diuji untuk mendapatkan ketinggian bilah navigasi (dalam piksel):
Kode yang diuji untuk mendapatkan tinggi bilah status (dalam piksel):
Mengonversi piksel menjadi dp:
sumber
Dalam kasus Samsung S8, tidak ada metode yang disediakan di atas yang memberikan ketinggian bilah navigasi yang tepat jadi saya menggunakan penyedia ketinggian keyboard KeyboardHeightProvider android . Dan itu memberi saya ketinggian dalam nilai negatif dan untuk posisi tata letak saya, saya menyesuaikan nilai itu dalam perhitungan.
Ini dia
KeyboardHeightProvider.java
:popupwindow.xml
:Penggunaan dalam
MainActivity
Untuk bantuan lebih lanjut, Anda dapat melihat penggunaan lanjutan ini di sini .
sumber
Seperti yang disarankan dalam banyak jawaban di atas, misalnya
Hanya mendapatkan tinggi bilah navigasi mungkin tidak cukup. Kita perlu mempertimbangkan apakah 1. bilah navigasi ada, 2. apakah di bagian bawah, atau kanan atau kiri, 3. apakah aplikasi terbuka dalam mode multi-jendela.
Untungnya Anda dapat dengan mudah melewati semua pengkodean panjang hanya dengan mengatur
android:fitsSystemWindows="true"
tata letak root Anda. Sistem Android akan secara otomatis menangani penambahan pengisi yang diperlukan ke tata letak root untuk memastikan bahwa tampilan anak tidak masuk ke bilah navigasi atau wilayah bilah status.Ada solusi satu baris sederhana
atau secara terprogram
Anda juga bisa mendapatkan tampilan root
Untuk detail lebih lanjut tentang mendapatkan tampilan root, lihat - https://stackoverflow.com/a/4488149/9640177
sumber