Mengapa tidak menggunakan selalu android: configChanges = “keyboardHidden | orientasi”?

178

Saya bertanya-tanya mengapa tidak digunakan android:configChanges="keyboardHidden|orientation"dalam setiap (hampir setiap;) aktivitas)?

Barang:

  • tidak perlu khawatir aktivitas Anda sudah dirotasi
  • lebih cepat

Tidak begitu baik:

  • perlu mengubah tata letak Anda jika tergantung pada ukuran layar (misalnya tata letak dengan dua kolom atau lebih)

Buruk:

  • tidak ada cara yang fleksibel untuk memiliki tata letak yang berbeda pada orientasi yang berbeda
  • tidak begitu baik saat menggunakan fragmen

Tetapi jika kita tidak menggunakan tata letak yang berbeda, mengapa tidak?

Mikooos
sumber
6
Anda juga harus menjelaskan apa yang Anda pikirkan tentang orientasi keyboardHidden |
Blundell
Itu mencegah dari menggunakan penanganan asli dari perubahan konfigurasi yang ditentukan dan memungkinkan aplikasi untuk menanganinya, bukan?
Mikooos
2
Itu sebabnya opsi ini ada di sana, jika Anda tahu apa yang Anda lakukan (tidak ada perubahan sumber daya), gunakan itu.
Pointer Null
mengapa lebih cepat daripada menggunakan ScreenSize?
batmaci

Jawaban:

334

Latar Belakang Cepat

Secara default, ketika perubahan konfigurasi tombol tertentu terjadi pada Android (contoh umum adalah perubahan orientasi), Android sepenuhnya memulai kembali Aktivitas yang sedang berjalan untuk membantunya menyesuaikan dengan perubahan tersebut.

Ketika Anda mendefinisikan android:configChanges="keyboardHidden|orientation"di AndroidManifest Anda, Anda memberi tahu Android: "Tolong jangan lakukan reset default ketika keyboard ditarik keluar, atau ponsel diputar; saya ingin menangani ini sendiri. Ya, saya tahu apa yang saya lakukan "

Apakah ini hal yang baik? Kita akan segera melihat ...

Jangan khawatir?

Salah satu pro Anda mulai dengan bahwa ada:

tidak perlu khawatir aktivitas Anda sudah dirotasi

Dalam banyak kasus, orang secara keliru percaya bahwa ketika mereka memiliki kesalahan yang dihasilkan oleh perubahan orientasi ("rotasi"), mereka dapat memperbaikinya dengan memasukkan android:configChanges="keyboardHidden|orientation".

Namun, android: configChanges = "keyboardHidden | orientasi" tidak lebih dari seorang bandaid. Sebenarnya, ada banyak cara perubahan konfigurasi dapat dipicu. Misalnya, jika pengguna memilih bahasa baru (mis. Lokal telah berubah), aktivitas Anda akan dimulai kembali dengan cara yang sama seperti perubahan orientasi. Jika mau, Anda dapat melihat daftar semua jenis perubahan konfigurasi .

Sunting : Lebih penting lagi, seperti yang ditunjukkan oleh hackbod di komentar, aktivitas Anda juga akan dimulai ulang ketika aplikasi Anda ada di latar belakang dan Android memutuskan untuk membebaskan sebagian memori dengan membunuhnya. Saat pengguna kembali ke aplikasi Anda, Android akan mencoba untuk memulai kembali aktivitas dengan cara yang sama jika ada perubahan konfigurasi lainnya. Jika Anda tidak bisa mengatasinya - pengguna tidak akan senang ...

Dengan kata lain, menggunakan android:configChanges="keyboardHidden|orientation"bukanlah solusi untuk "kekhawatiran" Anda. Cara yang benar adalah dengan kode aktivitas Anda sehingga mereka senang dengan setiap restart Android melemparnya. Ini adalah praktik yang baik yang akan membantu Anda, jadi biasakanlah.

Jadi kapan saya harus menggunakannya?

Seperti yang Anda sebutkan ada keuntungan yang berbeda. Menimpa perubahan konfigurasi default untuk rotasi dengan menanganinya sendiri akan mempercepat. Namun, kecepatan ini memang datang dengan harga kenyamanan.

Sederhananya, jika Anda menggunakan tata letak yang sama untuk potret dan lanskap, Anda dalam kondisi yang baik dengan melakukan penulisan ulang. Alih-alih memuat ulang seluruh kegiatan, tampilan hanya akan bergeser untuk mengisi ruang yang tersisa.

Namun , jika karena alasan tertentu Anda menggunakan tata letak yang berbeda saat perangkat dalam lanskap, fakta bahwa Android memuat ulang Aktivitas Anda adalah baik karena kemudian akan memuat tata letak yang benar. [Jika Anda menggunakan override pada Activity seperti itu, dan ingin melakukan tata letak magis saat runtime ... well, semoga sukses - itu jauh dari sederhana]

Ringkasan Cepat

Dengan segala cara, jika cocok android:configChanges="keyboardHidden|orientation"untuk Anda, maka gunakanlah. Tetapi tolong pastikan untuk menguji apa yang terjadi ketika sesuatu berubah, karena perubahan orientasi bukan satu-satunya cara memulai kembali aktivitas penuh.

yydl
sumber
50
Perlu ditambahkan bahwa tidak menangani aktivitas Anda dimulai kembali berarti Anda memiliki masalah lebih besar daripada tidak menangani perubahan konfigurasi yang kurang umum. Restart aktivitas yang digunakan di sini adalah mekanisme yang sama persis dengan cara Android mengembalikan aktivitas Anda ke keadaan sebelumnya saat aplikasi Anda terbunuh di latar belakang. Jadi, jika Anda tidak melakukan ini dengan benar, pengguna Anda akan mengalami aplikasi Anda secara acak tidak kembali dengan benar ketika mereka kembali dari latar belakang, tergantung pada apakah prosesnya terbunuh. Jadi manfaat yang sangat besar: itu memastikan aplikasi Anda restart dengan benar.
hackbod
14
Dari Android 3.x jangan ketinggalan untuk menambahkan "screenSize" ---------- android: configChanges = ["mcc", "mnc", "locale", "touchscreen", "keyboard", "keyboardHidden", "navigasi", "screenLayout", "fontScale", "uiMode", "orientasi", "screenSize", "smallestScreenSize"]
Michael Biermann
1
Saya perhatikan bahwa ketika Anda menggunakan atribut configChanges, aplikasi Anda juga mengabaikan fitur kunci orientasi. Bagaimana Anda bisa menyelesaikan ini? jika Anda tahu jawabannya, silakan tulis di sini: stackoverflow.com/questions/24000361/…
pengembang android
4
Please don't do the default reset when the keyboard is pulled outsaya belum pernah melihat aktivitas Restart untuk Keyboard menarik !
Muhammad Babar
baik restart sesekali ok menurut saya ... configChanges menangani sebagian besar kasus untuk saya ... well mungkin dalam beberapa jenis lain dalam aplikasi ini bisa menjadi masalah tapi itu tergantung benar-benar ....
Renetik
2

Dari sudut pandang saya: Jika tata letak sama dalam mode lansekap dan potret - Anda mungkin juga menonaktifkan salah satu dari keduanya di aplikasi Anda.

Alasan mengapa saya menyatakan ini adalah bahwa saya sebagai pengguna mengharapkan aplikasi untuk memberi saya beberapa manfaat, ketika saya mengubah orientasi. Jika tidak masalah bagaimana saya memegang telepon saya, maka saya tidak perlu pilihan.

Ambil contoh aplikasi di mana Anda memiliki ListView, dan setelah mengklik ListItem Anda ingin ditampilkan tampilan detail untuk item itu. Dalam lansekap Anda dapat melakukan ini dengan membagi layar menjadi dua, memiliki ListView di sebelah kiri dan tampilan detail di sebelah kanan. Di Portrait Anda akan memiliki daftar dalam satu layar dan kemudian mengubah layar ke tampilan detail ketika ListItem dipilih. Dalam hal perubahan orientasi masuk akal serta tata letak yang berbeda.

kaspermoerch
sumber
4
Ya, kami melakukannya dengan itu di versi 1.0 dari aplikasi kami, untuk mencocokkan rilis Apple kami. Itu disajikan HANYA dalam potret. Yang tampak hebat pada Droid X saya, kami cocok dengan perilaku keyboard sembulan versi iOS. Kemudian CFO menginstal aplikasi pada Droid-nya, memutarnya ke samping dan geser keyboard terbuka. Ups. Hal tentang Android adalah platform terbuka dan Anda benar-benar tidak dapat memprediksi konfigurasi perangkat keras atau apa yang ingin dilakukan pengguna dengan itu, jadi Anda mungkin harus mendukung kedua orientasi (semua) untuk berjaga-jaga.
Tevo D
1
Yang kebetulan mengesampingkan pengaturan hanya potret kami karena pada dasarnya di perangkat keras lansekap yang kemudian orientasi normal, bukan alternatif. Yang BENAR-BENAR mengacaukan tata letak kami :( dan cukup memalukan, memiliki kelemahan besar dalam beberapa detik dari dia menginstal aplikasi
Tevo D
1
Mengapa Anda mencoba membuatnya berperilaku persis seperti iOS? :(
FunkTheMonk
7
@FunkTheMonk Sayangnya kita hidup di dunia di mana pengusaha membuat keputusan teknis. Sekalipun Anda membantahnya, separuh waktu mereka menganggap mereka benar. Dan mereka mengendalikan gaji Anda.
StackOverflowed
2
Menggunakan hanya satu tata letak tidak berarti layar akan terlihat sama ketika diputar. Tata letak XML yang terstruktur dengan baik akan menyebabkan berbagai hal secara otomatis bergeser berfungsi dengan baik dengan dimensi yang masuk akal, dan pengguna akan menghargai itu.
Melinda Green
-1

Saya tidak mengerti mengapa .... restart sesekali ok menurut saya ... configChanges menangani sebagian besar kasus untuk saya ... yah mungkin dalam beberapa jenis aplikasi ini bisa menjadi masalah tapi itu tergantung pada jenis aplikasi dan bagaimana Anda mengembalikan nyatakan kapan aplikasi restart ... Ketika salah satu aplikasi saya restart pengguna login kembali dan aktivitas terakhir dibuka oleh kode saya dan pengguna hanya kehilangan beberapa langkah untuk kembali ke tempatnya semula tetapi bukan masalah besar .. Di beberapa negara lain keadaan selalu bertahan dan beberapa negara selalu dipulihkan saat restart. Ketika aktivitas dimulai kembali itu harus bahwa aplikasi belum pernah digunakan atau sesuatu ... jadi tidak ada masalah sama sekali ... Dalam game misalnya ini bisa menjadi masalah mungkin atau dalam beberapa jenis aplikasi lain yang saya tidak tahu ...

Saya mengatakan bahwa ketika Anda melakukannya dengan cara ini aplikasi berfungsi dengan baik dalam keadaan normal. Dan kode jauh lebih mudah dibaca tanpa banyak logika yang diperlukan untuk menyimpan dan memulihkan di mana Anda hanya dapat membuat bug baru dan harus memeliharanya setiap saat ... pasti jika android kehabisan daya dan membunuh Anda jendela aplikasi Anda kehilangan konteks dan dimulai lagi, tetapi ini terjadi hanya dalam situasi khusus dan pada perangkat yang lebih baru saya yakin ini semakin jarang ...

Jadi bunuh aku, tapi aku menggunakan ini di aplikasi cukup berhasil ... android: configChanges = "lokal | keyboard | keyboardHidden | orientasi | screenLayout | uiMode | screenSize | smallestScreenSize" Tapi saya mengerti bahwa untuk beberapa jenis aplikasi khusus mungkin tidak cara yang baik tetapi sebagian besar aplikasi dapat hidup dengan ini saja OK.

Renetik
sumber
Hai, bisakah seseorang yang berpengetahuan luas tentang topik ini silakan melihat utas saya: stackoverflow.com/questions/35941585/…? Sangat membutuhkan bantuan.
Luke Allison
Anda harus sepenuhnya mendukung penyimpanan / melanjutkan aktivitas ... menanganinya untuk rotasi tidak berbeda ... Anda mengatakan Anda kehilangan beberapa langkah ... jika Anda melakukannya dengan benar, Anda tidak kehilangan langkah dan Anda mengembalikan dengan tepat di mana pengguna tinggalkan ... bahkan setelah restart perangkat.
HaMMeReD
dipalu Saya tidak tahu apa yang Anda bicarakan tetapi saya mengatakan bahwa ketika Anda melakukannya dengan cara ini aplikasi berfungsi dengan baik dalam keadaan normal. Dan kode jauh lebih mudah dibaca tanpa banyak logika yang diperlukan untuk menyimpan dan memulihkan di mana Anda hanya dapat membuat bug baru dan harus memeliharanya setiap saat ... pasti jika android kehabisan daya dan membunuh Anda jendela aplikasi Anda kehilangan konteks dan dimulai lagi, tetapi ini terjadi hanya dalam situasi khusus dan pada perangkat yang lebih baru saya yakin ini semakin jarang ...
Renetik
Mengabaikan mematuhi kontrak Aktivitas (keadaan menabung / memulihkan) adalah praktik yang buruk, dan ini merupakan saran yang mengerikan secara keseluruhan. Coba uji terhadap proses kematian dan lihat di mana aplikasi Anda mendapatkan Anda, dan perilaku ini benar-benar standar "keadaan normal" jika pengguna Anda menggunakan setidaknya 2-3 aplikasi di ponsel mereka dan beralih di antara mereka.
EpicPandaForce
-3

Ya saya pikir berhenti akan membuatnya lebih cepat daripada melepaskan pemain. Masih ada jeda.

Sekarang telah menemukan solusi yang tidak akan menghentikan lagu.

Nyatakan dalam manifes bahwa Anda akan menangani perubahan konfigurasi untuk orientasi layar dan kemudian menggunakan metode onConfigurationChanged untuk memuat file tata letak. Dengan melakukan ini di logCat saya dapat melihat onPause, onCreate & onResume tidak dipanggil, dan karena itu lagunya tidak dijeda.

  1. perbarui manifes untuk menangani orientasi.

    android:configChanges="orientation|screenSize"
  2. tambahkan kode ini

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub      
        super.onConfigurationChanged(newConfig);        
        setContentView(R.layout.activity_main);
    }
Raul
sumber
Anda harus menggunakan layanan untuk memutar musik. Serius, Anda menyuruh orang menambahkan kode yang masih memiliki "// TODO Auto-generate method stub" di dalamnya. Solusi ceroboh. Ini juga tidak akan bekerja dengan baik, Anda harus mem-rebind semua referensi Anda, dan jika tidak, mereka tidak akan bisa diprediksi.
HaMMeReD