Neden her zaman android kullanmıyorsunuz: configChanges = “keyboardHidden | orientation”?


178

Neden android:configChanges="keyboardHidden|orientation"her (neredeyse her;) aktivitede kullanılmadığını merak ediyordum ?

Mal:

  • aktivitenizin döndürüldüğü konusunda endişelenmenize gerek yok
  • o daha hızlı

Çok iyi değil:

  • ekran boyutuna bağlıysa mizanpajlarınızı değiştirmeniz gerekir (örn. iki sütunlu mizanpajlar)

Kötü:

  • Farklı yönlerde farklı düzenlere sahip olmanın esnek bir yolu yok
  • fragman kullanırken çok iyi değil

Ama farklı düzenler kullanmazsak, neden olmasın?


6
Ayrıca klavyenizi ne düşündüğünüzü açıklamalısınızHidden | orientation ne yapıyor
Blundell

Belirtilen yapılandırma değişikliklerinin yerel olarak kullanılmasını engelliyor ve uygulamanın bunu yapmasına izin veriyor, değil mi?
Mikooos

2
Bu yüzden bu seçenek oradadır, ne yaptığınızı biliyorsanız (kaynaklarda değişiklik yok), kullanın.
Pointer Null

neden ScreenSize kullanmaktan daha hızlı?
batmacı

Yanıtlar:


334

Hızlı Arkaplan

Varsayılan olarak, Android'de bazı önemli yapılandırma değişiklikleri gerçekleştiğinde (yaygın bir örnek bir yönlendirme değişikliğidir), Android, bu tür değişikliklere uyum sağlaması için çalışan Etkinliği tamamen yeniden başlatır.

android:configChanges="keyboardHidden|orientation"AndroidManifest'inizde tanımladığınızda , Android'e şunları söylüyorsunuz: "Lütfen klavye çıkarıldığında veya telefon döndürüldüğünde varsayılan sıfırlamayı yapmayın; Bunu kendim halletmek istiyorum. Evet, ne yaptığımı biliyorum "

Bu iyi bir şey mi? Yakında göreceğiz ...

Telaşa gerek yok?

Başladığınız profesyonellerden biri:

aktivitenizin döndürüldüğü konusunda endişelenmenize gerek yok

Çoğu durumda, insanlar yanlışlıkla bir yönelim değişikliği ("döndürme") tarafından üretilen bir hata olduğunda, bunu koyarak düzeltebileceklerine inanırlar android:configChanges="keyboardHidden|orientation".

Ancak, android: configChanges = "keyboardHidden | orientation" bir bandajdan başka bir şey değildir. Gerçekte, bir konfigürasyon değişikliğinin tetiklenmesinin birçok yolu vardır. Örneğin, kullanıcı yeni bir dil seçerse (örneğin, yerel ayar değişti), etkinliğiniz bir yönlendirme değişikliği ile aynı şekilde yeniden başlatılır. İsterseniz , tüm farklı yapılandırma değişikliği türlerinin bir listesini görüntüleyebilirsiniz .

Düzenleme : Daha da önemlisi, hackbod yorumlarda belirttiği gibi, uygulamanız arka planda olduğunda ve Android öldürerek bazı belleği boşaltmaya karar verirken etkinliğiniz de yeniden başlatılacak. Kullanıcı uygulamanıza geri döndüğünde, Android başka bir yapılandırma değişikliği varsa etkinliği olduğu gibi yeniden başlatmayı dener. Bunu başaramazsanız - kullanıcı mutlu olmaz ...

Başka bir deyişle, kullanmak android:configChanges="keyboardHidden|orientation""endişeleriniz" için bir çözüm değildir. Doğru yol, aktivitelerinizi kodlamaktır, böylece Android'lerin yeniden başlattığı herhangi bir yeniden başlatmadan memnun olurlar. Bu, yolda size yardımcı olacak iyi bir uygulamadır, bu yüzden buna alışın.

Ne zaman kullanmalıyım?

Bahsettiğiniz gibi belirgin bir avantaj var. Bir döndürme için varsayılan yapılandırma değişikliğinin üzerine yazarak, işleri hızlandıracaksınız. Ancak, bu hız bir kolaylık fiyatı ile geliyor.

Basitçe söylemek gerekirse, hem portre hem de manzara için aynı düzeni kullanırsanız, üzerine yazma işlemini gerçekleştirirsiniz. Etkinliğin tümüyle yeniden doldurulması yerine, görünümler kalan alanı doldurmak için kolayca kayacaktır.

Bununla birlikte , herhangi bir nedenle cihaz yatay konumdayken farklı bir düzen kullanırsanız, Android'in Etkinliğinizi yeniden yüklemesi iyidir, çünkü daha sonra doğru düzeni yükleyecektir. [Bu tür bir Etkinlikte geçersiz kılmayı kullanırsanız ve çalışma zamanında büyülü bir yeniden düzen yapmak istiyorsanız ... iyi şanslar - çok basit değil]

Hızlı özet

Elbette, android:configChanges="keyboardHidden|orientation"sizin için uygunsa , o zaman kullanın. Ancak LÜTFEN bir şey değiştiğinde ne olduğunu test ettiğinizden emin olun, çünkü tam bir Aktivitenin yeniden başlatılmasının tek yolu bir yön değişikliği değildir.


50
Etkinliğinizin yeniden başlatılmamasının daha az yaygın yapılandırma değişikliklerini gerçekleştirmekten daha büyük sorunlarınız olduğu anlamına gelmeye değer. Burada kullanılan etkinlik yeniden başlatma özelliği, uygulamanız arka planda öldürüldüğünde Android'in etkinliğinizi önceki durumuna nasıl geri yüklediği ile aynı mekanizmadır. Dolayısıyla, bunu doğru bir şekilde yapmazsanız, işleminizin öldürülüp öldürülmediğine bağlı olarak, kullanıcılarınız arka plandan döndüklerinde uygulamanızın rastgele geri dönmemesini deneyimleyecektir. Bu yüzden büyük bir avantaj: uygulamanızın doğru bir şekilde yeniden başlatılmasını sağlar.
hackbod

14
Android 3.x sürümünde "screenSize" eklemeyi kaçırmayın ---------- android: configChanges = ["mcc", "mnc", "yerel", "dokunmatik ekran", "klavye", "keyboardHidden", "navigation", "screenLayout", "fontScale", "uiMode", "orientation", "screenSize", "smallestScreenSize"]
Michael Biermann 21:

1
ConfigChanges özniteliğini kullandığınızda, uygulamanızın yön kilidi özelliğini de yok saydığını fark ettim. Bunu nasıl çözebilirsin? Cevabı biliyorsanız, lütfen buraya yazın: stackoverflow.com/questions/24000361/…
android geliştirici

4
Please don't do the default reset when the keyboard is pulled outKlavye dışarı çekin için bir Aktivite yeniden başlatma görmedim !
Muhammad Babar

Bence zaman zaman yeniden başlatmalar tamam ... configChanges benim için çoğu durumda işler ... belki uygulamalarda başka tipte bu sorun olabilir ama gerçekten bağlıdır ....
Renetik

2

Benim bakış açımdan: Düzen hem yatay hem de dikey modda aynıysa, uygulamanızdaki ikisinden birini devre dışı bırakabilirsiniz.

Bunu belirtmemizin nedeni, kullanıcı olarak uygulamanın yönlendirmeyi değiştirdiğimde bana biraz fayda sağlamasını beklemem. Telefonumu nasıl tuttuğum önemli değilse, seçime ihtiyacım yok.

Örneğin, bir ListView'a sahip olduğunuz bir uygulamayı ele alalım ve bir ListItem'e tıkladığınızda o öğe için ayrıntılı bir görünüm gösterilmesini istersiniz. Peyzajda, ekranı ListView solda ve ayrıntılı görünüm sağda olmak üzere ikiye bölerek bunu yapmazsınız. Dikey'de listeyi bir ekranda görürsünüz ve bir ListItem seçildiğinde ekranı ayrıntılı görünüme değiştirirsiniz. Bu durumda yönelim değişikliği, farklı düzenlerin yanı sıra mantıklıdır.


4
Evet, Apple sürümümüzle eşleşmesi için uygulamamızın 1.0 sürümünde bununla gittik. SADECE portre olarak sunuldu. Droid X'imde harika görünen, IOS sürümünün pop-up klavye davranışıyla tam olarak eşleştik. Daha sonra CFO uygulamayı Droid'ine yükledi, yana çevirdi ve klavyeyi kaydı. Hata. Android ile ilgili olan şey açık bir platformdur ve donanım yapılandırmasını veya kullanıcının onunla ne yapmak isteyeceğini gerçekten tahmin edemezsiniz, bu nedenle muhtemelen her iki (tüm) yönlendirmeyi de desteklemelisiniz.
Tevo D

1
Bu, temelde donanımda olduğu için sadece portre ayarımızı geçersiz kıldı. Hangi GERÇEKTEN bizim düzeni berbat :( ve oldukça utanç verici, onu yükledikten sonra birkaç saniye içinde büyük bir kusur vardı
Tevo D

1
Neden tam olarak iOS gibi davranmaya çalışıyordunuz? :(
FunkTheMonk

7
@FunkTheMonk Maalesef işadamlarının teknik kararlar aldığı bir dünyada yaşıyoruz. Buna karşı çıksanız bile, haklı olduğunu düşündüklerinin yarısı kadar. Ve maaş çekini kontrol ediyorlar.
StackOverflowed

2
Yalnızca bir mizanpaj kullanmak, ekran döndürüldüğünde aynı görüneceği anlamına gelmez. İyi yapılandırılmış bir XML düzeni, işlerin otomatik olarak makul boyutlarda iyi çalışması için değişmesine neden olur ve kullanıcılar bunu takdir edecektir.
Melinda Green

-1

Nedenini görmüyorum .... ara sıra yeniden başlatmalar benim görüşüme göre tamam ... configChanges benim için çoğu durumda işler ... belki bazı uygulama türlerinde bu sorun olabilir ama gerçekten uygulamanın türüne ve nasıl geri yüklediğinize bağlıdır Uygulama yeniden başlatıldığında durumu ... Uygulamamdan biri yeniden başlatıldığında kullanıcı geri kaydedilir ve son etkinlik kodum tarafından açılır ve kullanıcı jus, bulunduğu yere geri dönmek için bazı adımları kaybeder. bazı durumlar her zaman yeniden başlatma sırasında geri yüklenir. Etkinlik yeniden başlatıldığında, bu uygulamanın kullanılmamış olması ya da başka bir şey olması gerekiyordu ... bu yüzden hiç sorun yok ... Örneğin oyunda bu sorun olabilir ya da bilmediğim başka bir uygulama türünde olabilir ...

Bu şekilde yaptığınızda uygulamaların normal şartlar altında iyi çalıştığını söylüyorum. Ve kod sadece u yeni hatalar yapabilir ve her zaman korumak zorunda nerede kaydetmek ve geri yüklemek için gerekli ton mantık olmadan çok daha okunabilir ... android güç tükenir ve uygulama penceresini öldürmek emin olun içeriği kaybetmek ve tekrar başlar, ancak bu sadece özel durumlarda olur ve yeni cihazlarda bunun daha nadir olduğuna inanıyorum ...

Öyleyse beni öldür, ama bunu uygulamalarda oldukça başarılı bir şekilde kullanıyorum ... android: configChanges = "locale | keyboard | keyboardHidden | orientation | screenLayout | uiMode | screenSize | smallestScreenSize" Ama bazı özel uygulamalar için bunun olmayabilir iyi bir yol ama uygulamaların çoğu bu sadece OK ile yaşayabilir.


Merhaba bu konu hakkında bilgili biri benim konu bir göz atın: stackoverflow.com/questions/35941585/…? Umutsuzca yardıma ihtiyacım var.
Luke Allison

Etkinliklerde kaydetme / devam ettirmeyi tam olarak desteklemelisiniz ... rotasyon için işlem farklı değil ... Birkaç adımı kaybettiğinizi söylüyorsunuz ... eğer düzgün yaparsanız hiçbir adımı kaybetmezsiniz ve kullanıcının kaldığı yeri tam olarak geri yüklersiniz ... cihaz yeniden başlatıldıktan sonra bile.
HaMMeReD

Dövülmüş ne hakkında konuştuğunuzu bilmiyorum ama bunu yaptığınızda uygulamaların normal şartlar altında iyi çalıştığını söylüyorum. Ve kod sadece u yeni hatalar yapabilir ve her zaman korumak zorunda nerede kaydetmek ve geri yüklemek için gerekli ton mantık olmadan çok daha okunabilir ... android güç tükenir ve uygulama penceresini öldürmek emin olun içeriği kaybetmek ve tekrar başlar, ancak bu sadece özel durumlarda olur ve daha yeni cihazlarda bunun daha nadir olduğuna inanıyorum ...
Renetik

Faaliyet sözleşmesine uymayı (devleti kaydetme / geri yükleme) göz ardı etmek kötü bir uygulamadır ve bu genel olarak korkunç bir tavsiyedir. İşlem ölümüne karşı test etmeyi deneyin ve uygulamanızın sizi nereye götürdüğüne bakın ve kullanıcılarınız telefonlarında en az 2-3 uygulama kullanıyorsa ve aralarında geçiş yapıyorsa bu davranış tamamen standart "normal durum" dur.
EpicPandaForce

-3

Evet, duraklatmanın oyuncuyu serbest bırakmaktan daha hızlı yapacağını düşünüyorum. Yine de duraklama var.

Şimdi şarkıyı duraklatmayacak bir çözüm bulduk.

Manifest'te ekran yönlendirmesi için yapılandırma değişikliğini işleyeceğinizi belirtin ve ardından düzen dosyasını yüklemek için onConfigurationChanged yöntemini kullanın. Bunu logCat içinde yaparak onPause, onCreate & onResume işlevini görmüyorum ve bu nedenle şarkı duraklatılmıyor.

  1. yönlendirmeyi işlemek için bildirimi güncelleyin.

    android:configChanges="orientation|screenSize"
  2. bu kodu ekle

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub      
        super.onConfigurationChanged(newConfig);        
        setContentView(R.layout.activity_main);
    }

Müzik çalmak için bir servis kullanıyor olmalısınız. Cidden, insanlara içinde hala "// TODO Otomatik oluşturulan yöntem saplaması" olan kod eklemelerini söylüyorsunuz. Özensiz çözüm. Güzel de çalışmaz, tüm referanslarınızı yeniden hatırlamanız gerekir ve eğer yapmazsanız en iyi ihtimalle tahmin edilemez olacaklardır.
HaMMeReD
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.