Saya ingin tablet dapat ditampilkan dalam potret dan lanskap (sw600dp atau lebih tinggi), tetapi ponsel dibatasi hanya untuk potret. Saya tidak dapat menemukan cara untuk memilih orientasi secara kondisional. Ada saran?
android
tablet
screen-orientation
Kenny Wyland
sumber
sumber
layout-land
di dalamres
.Jawaban:
Berikut cara yang baik menggunakan sumber daya dan ukuran kualifikasi .
Masukkan sumber bool ini dalam res / nilai sebagai bools.xml atau apa pun (nama file tidak masalah di sini):
Letakkan ini di res / values-sw600dp dan res / values-xlarge:
Lihat jawaban tambahan ini untuk membantu menambahkan direktori dan file ini di Android Studio.
Kemudian, dalam metode onCreate dari Aktivitas Anda, Anda dapat melakukan ini:
Perangkat yang lebih dari 600 dp dalam arah lebar terkecil, atau x-besar pada perangkat pra-Android 3.2 (tablet, pada dasarnya) akan berperilaku seperti biasa, berdasarkan sensor dan rotasi yang dikunci pengguna, dll . Segala sesuatu yang lain (telepon, cukup banyak) akan menjadi potret saja.
sumber
xlarge
juga atau bisakah saya menggunakansw600dp
? Mungkin tidak ada tablet yang menjalankan <3.2 hari ini.onCreate()
. Ketika saya memindahkan panggilan kesetRequestedOrientation()
posisi yang berbeda dalam waktu dan konteks, restart tidak terjadi lagi.Anda dapat mencoba cara ini terlebih dahulu untuk mendapatkan ukuran layar perangkat
dan kemudian mengatur orientasi sesuai dengan itu
sumber
Configuration
memberikanscreenLayout
informasi - DPI. Sedangkan pertanyaannya terkait dengan ukuran layar perangkat fisik - ponsel VS tablet. Artinya, Anda dapat memilikiConfiguration.SCREENLAYOUT_SIZE_NORMAL
dan itu akan menjadi tablet MDPI.Tambahan untuk jawaban yang diterima
Anda dapat melakukan langkah-langkah berikut di Android Studio untuk menambahkan
res/values-sw600dp
danres/values-large
direktori denganbools.xml
file mereka .nilai-sw600dp
Pertama-tama, dari tab Project pilih filter Project (bukan Android) di navigator.
Kemudian klik kanan
app/src/main/res
direktori tersebut. Pilih Baru > Direktori Sumber Daya Android .Pilih Lebar Layar Terkecil , lalu tekan tombol >> .
Ketik
600
lebar layar terkecil. Nama direktori akan dibuat secara otomatis. Katakan OKKemudian klik kanan pada file yang baru dibuat
values-sw600dp
. Pilih Baru > File sumber daya Nilai . Ketikkanbools
nama.nilai-besar
Menambahkan
values-large
direktori hanya diperlukan jika Anda mendukung pra Android 3.2 (API level 13). Kalau tidak, Anda dapat melewati langkah ini. Thevalues-large
direktori sesuai denganvalues-sw600dp
. (values-xlarge
sesuai denganvalues-sw720dp
.)Untuk membuat
values-large
direktori, ikuti langkah-langkah yang sama seperti di atas, tetapi dalam hal ini pilih Ukuran daripada Lebar Layar Terkecil. Pilih Besar . Nama direktori akan dibuat secara otomatis.Klik kanan direktori seperti sebelumnya untuk membuat
bools.xml
file.sumber
Begini cara saya melakukannya (terinspirasi oleh http://androidblogger.blogspot.com/2011/08/orientation-for-both-phones-and-tablets.html ):
Di AndroidManifest.xml, untuk setiap aktivitas Anda ingin dapat mengubah antara potret dan lanskap (pastikan Anda menambahkan screenSize - Anda tidak membutuhkannya!) Anda tidak perlu mengatur orientasi layar di sini. :
Metode untuk ditambahkan di setiap Aktivitas:
dan: (jika Anda tidak menimpa metode ini, aplikasi akan memanggil onCreate () saat mengubah orientasi)
Di onCreate () dari setiap Kegiatan:
Satu-satunya hal yang saya tidak tahu adalah bagaimana cara mendapatkan aplikasi untuk mengubah file tata letak ketika beralih dari landscape ke portrait atau sebaliknya. Saya menganggap jawabannya adalah melakukan sesuatu yang mirip dengan apa yang dilakukan tautan di atas, tetapi saya tidak bisa membuatnya bekerja untuk saya - itu menghapus semua data saya. Tetapi jika Anda memiliki aplikasi yang cukup sederhana sehingga Anda memiliki file tata letak yang sama untuk potret dan lansekap, ini seharusnya berfungsi.
sumber
Mengikuti jawaban Ginny , saya pikir cara yang paling dapat diandalkan untuk melakukannya adalah sebagai berikut:
Seperti dijelaskan di sini , letakkan boolean di sumber sw sw00dp Itu harus memiliki awalan sw kalau tidak itu tidak akan berfungsi dengan baik:
dalam res / values-sw600dp / dimens.xml
dalam res / values / dimens.xml
Kemudian buat metode untuk mengambil boolean itu:
Dan aktivitas dasar untuk memperluas dari aktivitas di mana Anda menginginkan perilaku ini:
Jadi setiap aktivitas akan memperluas BaseActivity:
Penting : meskipun Anda memperluas dari
BaseActivity
, Anda harus menambahkan barisandroid:configChanges="orientation|screenSize"
ke masing-masingActivity
di AndroidManifest.xml Anda:sumber
Yah, ini agak terlambat, tetapi, ini adalah XML-Only tetapi solusi peretasan yang tidak menciptakan kembali aktivitas seperti
setRequestedOrientation
halnya jika harus mengubah orientasi:https://stackoverflow.com/a/27015879/1281930
sumber
Mengikuti jawaban yang diterima , saya menambahkan file kotlin dengan solusinya semoga membantu seseorang
Masukkan sumber bool ini
res/values
sebagai bools.xml atau apa pun (nama file tidak penting di sini):Masukkan ini
res/values-sw600dp
danres/values-sw600dp-land
:Kemudian, tambahkan di bawah garis dalam aktivitas atau fragmentvity Anda
sumber
Solusi lain tidak berhasil untuk saya. Saya masih memiliki beberapa masalah orientasi aneh dengan dialog dan masalah rekreasi. Solusi saya adalah memperluas Aktivitas, memaksanya sebagai potret dalam manifes.
Contoh:
manifes.xml:
dalam kegiatan splashcreen:
sumber
Pertanyaan lama yang saya tahu. Untuk menjalankan aplikasi Anda selalu dalam mode potret bahkan ketika orientasi mungkin atau sedang ditukar dll (misalnya pada tablet) Saya merancang fungsi ini yang digunakan untuk mengatur perangkat dalam orientasi yang benar tanpa perlu tahu bagaimana potret dan lansekap fitur disusun pada perangkat.
Bekerja seperti pesona!
PEMBERITAHUAN: Ubah
this.activity
aktivitas Anda atau tambahkan aktivitas utama dan hapusthis.activity
;-)Jika Anda ingin melakukan yang sebaliknya, Anda harus mengubah kode ke lansekap (tapi saya pikir sudah jelas caranya).
sumber
Sayangnya, menggunakan metode setRequestedOrientation (...) akan menyebabkan aktivitas dimulai ulang, jadi meskipun Anda menyebut ini dalam metode onCreate, ia akan melalui siklus hidup aktivitas dan kemudian akan membuat kembali aktivitas yang sama dengan orientasi yang diminta. Jadi pada jawaban @Brian Christensen Anda harus mempertimbangkan bahwa kode aktivitas mungkin dipanggil dua kali, ini dapat memiliki efek buruk (tidak hanya visual, tetapi juga pada permintaan jaringan, analitik, dll.).
Selain itu, untuk menetapkan atribut configChanges dalam manifes menurut saya merupakan trade-off besar, yang bisa memakan biaya besar untuk refactoring. Android Devs tidak merekomendasikan untuk mengubah atribut itu .
Akhirnya, mencoba untuk mengatur screenOrientation entah bagaimana berbeda (untuk menghindari masalah restart) tidak mungkin, secara statis tidak mungkin karena manifes statis yang tidak dapat diubah, secara terprogram hanya mungkin untuk memanggil metode itu dalam aktivitas yang sudah dimulai.
Ringkasan: Menurut pendapat saya, saran @Brian Christensen adalah trade-off terbaik, tetapi berhati-hatilah dengan masalah aktivitas memulai kembali.
sumber