Saya membuat beberapa elemen khusus, dan saya ingin secara terprogram menempatkannya di sudut kanan atas ( n
piksel dari tepi atas dan m
piksel dari tepi kanan). Karena itu saya perlu mendapatkan lebar layar dan tinggi layar dan kemudian mengatur posisi:
int px = screenWidth - m;
int py = screenHeight - n;
Bagaimana saya mendapatkan screenWidth
dan screenHeight
dalam Kegiatan utama?
getMetrics
. Komentar Nik dalam jawabannya bahkan menjelaskangetDisplayMetrics
untuk mempertimbangkan ukuran sistem / status bar. Anda juga dapat menggunakan kepadatan sebagai jmaculate dan LoungeKatt menjelaskan memiliki nilai EXACT :DisplayMetrics dm = getResources().getDisplayMetrics(); float fwidth = dm.density * dm.widthPixels;
Diuji di Android v2.2 (API 8) dan v4.0 dengan hasil yang baik dan tidak ada kesalahan / peringatan .Resources.getSystem().getDisplayMetrics()
. Anda tidak akan memerlukannyaContext
untuk mendapatkannya.Jawaban:
Jika Anda ingin dimensi tampilan dalam piksel, Anda dapat menggunakan
getSize
:Jika Anda tidak dalam,
Activity
Anda bisa mendapatkan defaultDisplay
melaluiWINDOW_SERVICE
:Jika Anda berada dalam fragmen dan ingin menyelesaikan ini cukup gunakan Activity.WindowManager (di Xamarin.Android) atau getActivity (). GetWindowManager () (dalam java).
Sebelum
getSize
diperkenalkan (di API level 13), Anda bisa menggunakangetWidth
dangetHeight
metode yang sudah usang:Namun untuk kasus penggunaan yang Anda gambarkan, margin / padding di tata letak tampaknya lebih tepat.
Cara lain adalah: DisplayMetrics
Kita dapat menggunakan
widthPixels
untuk mendapatkan informasi untuk:Contoh:
sumber
try/catch
cek semacam itu? Mengapa tidak menggunakanif (android.os.Build.VERSION.SDK_INT >= 13)
saja tanpa ada pengecualian sama sekali? Saya menganggaptry/catch
dalam aliran aplikasi normal sebagai praktik buruk.Salah satu caranya adalah:
Itu sudah usang, dan Anda harus mencoba kode berikut sebagai gantinya. Dua baris kode pertama memberi Anda
DisplayMetrics
objek. Benda ini berisi bidang-bidang sepertiheightPixels
,widthPixels
.sumber
Mungkin tidak menjawab pertanyaan Anda, tetapi mungkin berguna untuk mengetahui (saya mencari sendiri ketika saya sampai pada pertanyaan ini) bahwa jika Anda memerlukan dimensi Tampilan tetapi kode Anda sedang dieksekusi ketika tata letaknya belum ditata (misalnya dalam
onCreate()
) Anda dapat mengaturViewTreeObserver.OnGlobalLayoutListener
denganView.getViewTreeObserver().addOnGlobalLayoutListener()
dan memasukkan kode yang relevan yang membutuhkan dimensi tampilan di sana. Callback pendengar akan dipanggil ketika tata letak akan ditata.sumber
View.post()
tidak dijamin bekerja? Saya ingin tahu karena saya juga mengandalkan metode ini untuk mendapatkan ukuran Tampilan setelah tata letak dan tidak menyadarinya tidak dapat diandalkan.View
Anda dapatkanViewTreeObserver
? Atau apakah mereka semua berbagi yang sama?(Jawaban 2012, mungkin kedaluwarsa) Jika Anda ingin mendukung pra Honeycomb, Anda harus memasukkan kompatibilitas sebelum API 13. Sesuatu seperti:
Tentu saja metode yang sudah usang pada akhirnya akan dikeluarkan dari SDK terbaru, tetapi sementara kami masih mengandalkan sebagian besar pengguna kami yang memiliki Android 2.1, 2.2 dan 2.3, inilah yang tersisa.
sumber
Saya telah mencoba semua "solusi" yang mungkin gagal dan saya perhatikan bahwa aplikasi "Dalvik Explorer" Elliott Hughes selalu menunjukkan dimensi yang benar pada perangkat Android / versi OS. Saya akhirnya melihat proyek open source-nya yang dapat ditemukan di sini: https://code.google.com/p/enh/
Inilah semua kode yang relevan:
EDIT: versi yang sedikit ditingkatkan (hindari pengecualian menembak pada versi OS yang tidak didukung):
sumber
Cara termudah:
sumber
Untuk mengakses ketinggian bilah status untuk perangkat Android, kami lebih memilih cara terprogram untuk mendapatkannya:
Kode sampel
Variabel
result
memberikan tinggi dalam piksel.Untuk akses cepat
Untuk informasi lebih lanjut tentang ketinggian
Title bar
,Navigation bar
danContent View
, silakan lihat Ukuran Layar Perangkat Android .sumber
getResources().getDisplayMetrics().heightPixels + result
memberikan tinggi layar penuh sebenarnya. Jawaban Dragan Marjanović juga bekerja tetapi saya lebih suka solusi yang jauh lebih singkat dan lebih sederhana ini.OnApplyWindowInsetsListener
.Pertama dapatkan view (mis. Oleh
findViewById()
) dan kemudian Anda bisa menggunakan getWidth () pada view itu sendiri.sumber
Saya memiliki dua fungsi, satu untuk mengirim konteks dan yang lainnya mendapatkan tinggi dan lebar dalam piksel:
dan
sumber
@SuppressLint("NewApi")
tepat di atas tanda tangan fungsi agar dapat dikompilasi.Untuk penskalaan dinamis menggunakan XML ada atribut yang disebut "android: layout_weight"
Contoh di bawah ini, yang dimodifikasi dari respons synic pada utas ini , memperlihatkan tombol yang mengambil 75% layar (bobot = .25) dan tampilan teks mengambil 25% layar yang tersisa (bobot = .75).
sumber
Ini adalah kode yang saya gunakan untuk tugas:
Tampak cukup bersih, namun tetap harus menjaga penghinaan.
sumber
Bukankah ini solusi yang jauh lebih baik? DisplayMetrics hadir dengan semua yang Anda butuhkan dan berfungsi dari API 1.
Anda juga bisa mendapatkan tampilan aktual (termasuk dekorasi layar, seperti Bilah Status atau bilah navigasi perangkat lunak) menggunakan getRealMetrics , tetapi ini hanya berfungsi pada 17+ saja.
Apakah saya melewatkan sesuatu?
sumber
Hanya menambah jawaban Francesco. Pengamat lain yang lebih tepat, jika Anda ingin mengetahui lokasi di jendela atau lokasi di layar adalah ViewTreeObserver.OnPreDrawListener ()
Ini juga dapat digunakan untuk menemukan atribut lain dari tampilan yang sebagian besar tidak diketahui pada waktu onCreate () misalnya posisi yang digulir, posisi yang diskalakan.
sumber
Menggunakan kode berikut dalam Aktivitas.
sumber
Temukan lebar dan tinggi layar:
Dengan ini, kita bisa mendapatkan SDK 13 terbaru dan di atas.
sumber
sumber
Saya menemukan ini berhasil.
sumber
Perlu dikatakan, bahwa jika Anda tidak berada di
Activity
, tetapi diView
(atau memiliki variabelView
tipe dalam cakupan Anda), tidak perlu digunakanWINDOW_SERVICE
. Maka Anda dapat menggunakan setidaknya dua cara.Pertama:
Kedua:
Semua metode yang kami sebut di sini tidak usang.
sumber
sumber
Untuk mendapatkan dimensi layar gunakan metrik tampilan
Dapatkan tinggi dan lebar dalam piksel
sumber
Ini bukan jawaban untuk OP, karena ia ingin dimensi tampilan dalam piksel nyata. Saya ingin dimensi dalam "perangkat-independen-piksel", dan menyusun jawaban dari sini https://stackoverflow.com/a/17880012/253938 dan di sini https://stackoverflow.com/a/6656774/253938 saya datang dengan ini:
sumber
Anda bisa mendapatkan ukuran tinggi menggunakan:
dan ukuran lebar menggunakan
sumber
Ada cara non-usang untuk melakukan ini menggunakan DisplayMetrics (API 1), yang menghindari kekacauan mencoba / menangkap:
sumber
Saya akan membungkus kode getSize seperti ini:
sumber
Untuk yang mencari dimensi layar yang dapat digunakan tanpa Bilah Status dan Bilah Tindakan (juga berkat jawaban Swapnil):
sumber
Pertama-tama muat file XML dan kemudian tulis kode ini:
Tampilkan lebar dan tinggi sesuai resolusi layar Anda.
sumber
Ikuti metode di bawah ini:
sumber
Kotlin
sumber
Ada kalanya Anda perlu mengetahui dimensi tepat ruang yang tersedia untuk tata letak saat berada di aktivitas onCreate. Setelah beberapa pemikiran saya berhasil dengan cara ini.
Jika karena alasan tertentu Anda tidak ingin menambahkan aktivitas lain ke manifes Android, Anda dapat melakukannya dengan cara ini:
sumber
Jika Anda tidak ingin overhead WindowManagers, Points, atau Display, Anda dapat mengambil atribut tinggi dan lebar dari item View paling atas di XML Anda, asalkan tinggi dan lebarnya diatur ke match_parent. (Ini berlaku selama tata letak Anda memenuhi seluruh layar.)
Misalnya, jika XML Anda dimulai dengan sesuatu seperti ini:
Kemudian
findViewById(R.id.entireLayout).getWidth()
akan mengembalikan lebar layar danfindViewById(R.id.entireLayout).getHeight()
akan mengembalikan tinggi layar.sumber