2011-11-10 27 views
5

Ben basit bir DialogFragment bir (karmaşık) nesneyi düzenlemek için yapmak ilk ve son adla bir Kişi, nasıl desek anlamakta biraz sıkıntı ve her oluşan e-posta adreslerinin bir listesini yaşıyorum değiştirir bir enum (İş, Ev, vb) ve adres. Her şeydenAndroid DialogFragment ve yapılandırma

Birincisi, nasıl düzgün bir DialogFragment için Kişi nesnesi geçmek? Benim şu anki çözümüm, DialogFragmentim oluşturulduktan sonra, dialog.show() 'dan sonra çağrılan bir setPerson (Kişi kişi) yöntemine sahip. Bu, bir yapılandırma değişikliği gerçekleşene kadar çalışır (kullanıcı ekranı döndürür). DialogFragment yeniden oluşturuluyor ve Personem nesnesine yapılan başvuru boş. Örneği onSaveInstanceState kullanarak kaydedebileceğimi biliyorum, ancak nesne karmaşık ve pahalıdır ve bu şekilde büyük bir nesneyi ısrarla savurgan görünüyor.

Ayrıca, iletişimimi kullanan ve sorunu gideren etkinlikte yapılandırma değişikliğini devre dışı bırakmayı da denedim, ancak iletişim kutusunun yeniden kullanılabilir olmasını ve yapılandırma değişikliklerini devre dışı bırakmak için kullanılan tüm etkinlikleri gerektirmesini istiyorum.

Üçüncü seçenek statik değişkende Kişiye referansı kaydetmek için olurdu ama yine ben diyalog reuseable ve birden çok örneği desteklemek isterler.

Diğer insanlar, yeniden kullanılabilir iletişim kutularındaki pahalı ve karmaşık nesnelerini nasıl kullanır?

cevap

2

Eh, düzenlediğiniz nesne seri tamamen yapamıyorsanız fantastik yada güvenli olan bunların hiçbiri birkaç çözümler vardır.

Ben% 100 kaçınılmaz kesinlikle sürece hiç android:configChanges="orientation" kullanılmasını önermiyoruz. Başka yapılandırma değişiklikleri var ve bu çözümü kullanmaya başvurursanız uygulamanız yine de diğerleriyle birlikte kırılacak.

Fakat vakaların büyük çoğunluğunda çalışacak basit bir çözüm DialogFragment üzerinde setRetainInstance(true) aramak. Bu, Fragmanınızın yok edilmesini ve bir yapılandırma değişikliğinde yeniden oluşturulmasını engeller. Bununla birlikte, bunun işe yaramayacağı bir durum söz konusudur. OS'nin bir etkinliği veya uygulamayı 'buzda' uygulamaya çalışacağı, örneğin hafızayı korumak için kullanacağı konfigürasyon değişikliklerinin yanında başka nedenler de vardır. Bu durumda, nesneniz kaybolacaktır.

1

bir fragmanına karmaşık bir nesne geçirmek için temiz bir şekilde, nesne Parcelable uygulamak yapmak için bir Bundle nesneyi ekleyin ve fragment.setArguments(bundle) ile Fragment demeti geçmektir. Nesneyi, aramasındaki bir çağrı yoluyla paketin onActivityCreated() numaralı paketinden açabilirsiniz.

basitçe parçanın yöntemiyle sağlanan demetine "çalışma" parcelable Nesne kaydetmek, yapılandırma değişiklikleri argüman inat ve savedInstanceState !=null eğer onActivityCreated() ilerleyen argüman açmak için.

Parcelable uygulanmasından kayda değer bir performans artışı varsa veya "canlı" bir nesneyiniz varsa, bir seçenek veri nesnesini tutmak için UI olmayan bir parça oluşturmaktır. Ayrıntılara girmeden, UI olmayan parçada setRetainInstance(true) ve UI parçası ile bağlantıyı Activity'daki arabirimler üzerinden koordine edebilirsiniz.

İlgili konular