Adakah cara untuk menemukan secara terprogram apakah perangkat tempat aplikasi dipasang adalah tablet 7 inci atau tablet 10 inci?
android
android-layout
screen
Calon
sumber
sumber
Jawaban:
Anda dapat menggunakan
DisplayMetrics
untuk mendapatkan banyak informasi tentang layar tempat aplikasi Anda berjalan.Pertama, kami membuat
DisplayMetrics
objek metrik:Dari sini, kita bisa mendapatkan informasi yang dibutuhkan untuk mengukur tampilan:
Ini akan mengembalikan nilai absolut dari lebar dan tinggi dalam piksel, jadi 1280x720 untuk Galaxy SIII, Galaxy Nexus, dll.
Ini biasanya tidak membantu dengan sendirinya, karena saat kami bekerja pada perangkat Android, kami biasanya lebih suka bekerja dalam piksel kepadatan independen, celupkan.
Anda mendapatkan
density
layar menggunakanmetrics
lagi, dalam bentuk faktor skala untuk perangkat, yang didasarkan pada Sumber Daya Desain Android untukmdpi
,hdpi
dll.Dari hasil ini, kita dapat menghitung jumlah piksel independen kepadatan yang ada untuk tinggi atau lebar tertentu.
Hasil yang Anda peroleh dari ini akan membantu Anda memutuskan jenis layar yang Anda gunakan dalam hubungannya dengan contoh Konfigurasi Android , yang memberi Anda dp relatif untuk setiap ukuran layar:
Menggunakan informasi di atas, kita tahu bahwa jika lebar terkecil perangkat lebih besar dari 600dp, perangkat tersebut adalah tablet 7 ", jika lebih besar dari 720dp, perangkat tersebut adalah tablet 10".
Kita bisa menghitung lebar terkecil menggunakan
min
fungsiMath
class, meneruskanheightDp
danwidthDp
untuk mengembalikansmallestWidth
.Namun, ini tidak selalu memberi Anda kecocokan persis, terutama saat bekerja dengan tablet yang tidak dikenal yang mungkin salah merepresentasikan kepadatannya sebagai hdpi padahal sebenarnya bukan, atau yang mungkin hanya 800 x 480 piksel namun masih pada layar 7 " .
Lebih jauh ke metode ini, jika Anda perlu mengetahui dimensi perangkat yang tepat dalam inci, Anda dapat mengetahuinya juga, menggunakan
metrics
metode berapa banyak piksel yang ada per inci layar.Anda dapat menggunakan pengetahuan tentang berapa banyak piksel dalam setiap inci perangkat dan jumlah total piksel untuk menentukan berapa inci perangkat tersebut.
Ini akan mengembalikan tinggi dan lebar perangkat dalam inci. Ini sekali lagi tidak selalu membantu untuk menentukan jenis perangkat itu, karena ukuran perangkat yang diiklankan adalah diagonal, yang kami miliki hanyalah tinggi dan lebarnya.
Namun, kita juga tahu bahwa mengingat tinggi segitiga dan lebarnya, kita dapat menggunakan teorema Pythagoras untuk menghitung panjang hipotenusa (Dalam hal ini, ukuran layar diagonal).
Dari sini, kita dapat mengetahui apakah perangkat itu tablet atau bukan:
Dan begitulah cara Anda menghitung jenis perangkat yang Anda gunakan.
sumber
if (smallestWidth > 600) { /* 7" */ } else if (smallestWidth > 720) { /* 10" */ }
salah: 10 "tablet dikenali sebagai 7". Saya mengambil kebebasan untuk memperbaikinya.resources.getConfiguration().smallestScreenWidthDp
dari jawaban DeeV yang merupakan satu-satunya metode yang memberikan nilai yang sama baik dalam potret maupun lanskap pada Nexus 7 saya (600dp). Itu ditambahkan di API level 13.Tidak ada yang mengatakan
7"
atau10"
AFAIK. Ada sekitar dua cara untuk mendapatkan dimensi layar yang digunakan sistem saat mendekode bitmap dan yang lainnya. Keduanya ditemukan di objek aplikasi yangResources
ditemukan diContext
.Yang pertama adalah
Configuration
benda yang bisa diperolehgetContext().getResources().getConfiguration()
. Di dalamnya Anda memiliki:Configuration#densityDpi
- Kepadatan layar target yang sedang dirender, sesuai dengan qualifier sumber daya kepadatan.Configuration#screenHeightDp
- Ketinggian saat ini dari ruang layar yang tersedia, dalam unit dp, sesuai dengan kualifikasi sumber daya tinggi layar.Configuration#screenWidthDp
- Lebar saat ini dari ruang layar yang tersedia, dalam satuan dp, sesuai dengan kualifikasi sumber daya lebar layar.Configuration#smallestScreenWidthDp
- Ukuran layar terkecil yang akan dilihat aplikasi dalam operasi normal, sesuai dengan qualifier sumber daya lebar layar terkecil.Dengan itu, Anda dapat cukup banyak menggunakan pedoman layar untuk mencari tahu apakah perangkat Anda menarik dari folder sumber daya khusus masing-masing (
hdpi
,xhdpi
,large
,xlarge
, dll).Ingat, ini adalah beberapa ember:
layar kecil setidaknya 426dp x 320dp
320dp: layar ponsel biasa (240x320 ldpi, 320x480 mdpi, 480x800 hdpi, dll).
Info lebih lanjut
Yang kedua adalah
DisplayMetrics
benda yang diperolehgetContext().getResources().getDisplayMetrics()
. Dalam hal itu Anda memiliki:DisplayMetrics#density
- Kepadatan logis layar.DisplayMetrics#densityDpi
- Kepadatan layar dinyatakan sebagai titik per inci.DisplayMetrics#heightPixels
- Tinggi absolut tampilan dalam piksel.DisplayMetrics#widthPixels
- Lebar absolut tampilan dalam piksel.DisplayMetrics#xdpi
- Piksel fisik yang tepat per inci dari layar dalam dimensi X.DisplayMetrics#ydpi
- Piksel fisik per inci yang tepat dari layar dalam dimensi Y.Ini berguna jika Anda membutuhkan jumlah piksel layar yang tepat, bukan kepadatan. Namun, penting untuk dicatat bahwa ini semua adalah piksel layar. Tidak hanya yang tersedia untuk Anda.
sumber
smallestScreenWidthDp
. Berbeda dengan solusi lain, ini memberikan nilai yang sama pada Nexus 7 saya (600dp) terlepas dari orientasinya . Sebagai bonus, ini juga merupakan kode paling sederhana!tempatkan metode ini di onResume () dan dapat diperiksa.
umumnya tablet dimulai setelah ukuran 6 inci.
sumber
Hal di atas tidak selalu berfungsi saat beralih potret vs. lanskap.
Jika Anda menargetkan API level 13+, semudah yang dijelaskan di atas - gunakan Configuration.smallestScreenWidthDp, lalu uji sesuai:
Jika tidak, jika Anda mampu membelinya, gunakan metode berikut yang merupakan pendekatan yang sangat akurat untuk mendeteksi 600dp (seperti 6 ") vs. 720dp (seperti 10") dengan membiarkan sistem memberi tahu Anda:
1) Tambahkan ke layout-sw600dp dan layout-sw720dp (dan jika ada, lanskapnya) tampilan yang tidak terlihat dengan ID yang sesuai, misalnya:
Untuk 720, pada layout-sw720dp:
Untuk 600, pada layout-sw600dp:
2) Kemudian pada kode, misalnya, Aktivitas, uji sesuai:
sumber
Informasi hebat, hanya apa yang saya cari! Namun, setelah mencoba ini, saya menemukan bahwa saat menggunakan metrik yang disebutkan di sini, Nexus 7 (model 2012) melaporkan memiliki dimensi 1280x736. Saya juga memiliki Motorola Xoom yang menjalankan Jelly Bean dan salah melaporkan resolusi 1280x752. Saya menemukan posting ini di sini yang menegaskan ini. Pada dasarnya, di ICS / JB penghitungan menggunakan metrik yang disebutkan di atas tampaknya mengecualikan dimensi Bilah Navigasi. Beberapa penelitian lebih lanjut membawa saya pada jawaban Frank Nguyen di sini yang menggunakan metode berbeda yang akan memberi Anda dimensi piksel mentah (atau nyata) dari layar. Pengujian awal saya telah menunjukkan bahwa kode berikut dari koreksi Frank melaporkan dimensi pada Nexus 7 (model 2012 runnin JB) dan Motorola Xoom saya menjalankan JB:
sumber
Saya memiliki dua perangkat android dengan resolusi yang sama
Perangkat1 -> resolusi ukuran layar diagonal 480x800 -> 4,7 inci
Device2 -> resolusi ukuran layar diagonal 480x800 -> 4,0 inci
Ini memberi kedua ukuran layar diagonal perangkat -> 5,8
solusi untuk masalahmu adalah ..
lihat detailnya di sini ..
sumber
Cara Android menentukan ukuran layar adalah melalui empat ukuran umum: kecil , normal , besar , dan xlarge .
Sedangkan dokumentasi Android menyatakan bahwa kelompok ukuran tidak digunakan lagi
Umumnya penentu ukuran besar menentukan tablet 7 ". Dan penentu ukuran xlarge menentukan tablet 10":
Hal yang menyenangkan tentang memicu pada pengualifikasi ukuran, adalah Anda dapat menjamin bahwa aset dan kode Anda sesuai dengan aset mana yang akan digunakan atau jalur kode yang akan diaktifkan.
Untuk mengambil pengualifikasi ukuran dalam kode, lakukan panggilan berikut:
sumber
Anda dapat menggunakan metode di bawah ini untuk mendapatkan ukuran layar dalam inci, berdasarkan itu Anda dapat memeriksa tablet atau ponsel mana perangkat tersebut.
sumber
Saya menyimpan nilai dalam folder nilai yang memberi saya layar 7 inci atau 10 inci tetapi kami dapat melakukannya untuk perangkat apa pun menggunakan folder nilai.
seperti membuat folder nilai-2 yang berbeda untuk 2 perangkat yang berbeda. Tapi hal ini tergantung kebutuhan.
sumber
Anda harus melakukan sedikit komputasi menggunakan data yang diberikan oleh kelas DisplayMetrics .
Anda memiliki heightPixel dan widthPixels (resolusi layar dalam piksel)
Anda memerlukan diagonal karena 'ukuran layar inci' selalu menggambarkan panjang diagonal. Anda bisa mendapatkan layar diagonal dalam piksel (menggunakan pythagore)
diagonalPixel = √ (heightPixel² + widthPixels²)
maka Anda dapat mengubah nilai piksel menjadi inci berkat nilai densityDPI:
inchDiag = diagonalPixel / densityDPI.
Saya harap saya tidak membuat kesalahan di sini, ketahuilah bahwa nilai yang Anda peroleh dari kelas DisplayMetrics diberikan oleh konstruktor, tampaknya (dalam kasus yang sangat jarang) tidak diatur dengan baik sesuai dengan materi fisik ...
Ini akan memberi Anda ukuran layar fisik tetapi mungkin ini bukan cara yang lebih baik untuk mengelola banyak tata letak. Lebih lanjut tentang topik ini
sumber
Cara lain:
Buat 2 folder lagi: values-large + values-xlarge
Letakkan:
<string name="screentype">LARGE</string>
di folder besar nilai (strings.xml)Letakkan:
<string name="screentype">XLARGE</string>
di folder values-xlarge (strings.xml)Dalam kode:
String mType = getString (R.string.screentype);
if (mType! = null && mType.equals ("BESAR") {
// dari 4 ~ 7 inci
} lain jika (mType! = null && mType.equals ("XLARGE") {
// dari 7 ~ 10 inci
}
sumber
Voila! 😀 Hanya ini yang Anda perlukan untuk membedakan tablet dari ponsel
1. Fungsi pembantu untuk mendapatkan lebar layar:
2. Berfungsi untuk mengetahui apakah suatu perangkat adalah tablet
3. Terakhir, jika Anda ingin melakukan operasi yang berbeda untuk ukuran perangkat yang berbeda:
sumber
Berikut beberapa ekstensi kotlin yang berguna:
sumber
Resources
dalamContext
:resources.displayMetrics.isTablet()
atau dariWindowManager
yang disimpan diActivity
:val displayMetrics = DisplayMetrics()
windowManager.defaultDisplay.getMetrics(displayMetrics)
displayMetrics.isTablet()