SORU
9 Mart 2013, CUMARTESİ


Tüm sonra, doğru geri Parçaları örnek durumu nasıl kurtaracağını yığını?

ÇOK benzer bir soru birçok örneğini buldum ama cevap ne yazık ki benim gereksinimleri karşılar.

Portre ve manzara için farklı düzenler ve setRetainState() ve püf noktaları yapılandırmasını değiştirmek rutinleri kullanarak beni engelleyen hem yığını kullanarak geri döndüm.

Varsayılan işleyicisi kayıtlı değil hangi TextViews kullanıcı için bazı bilgileri vereceğim. Sadece kullanarak uygulama etkinliklerim yazarken, aşağıdaki iyi çalıştı:

TextView vstup;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.whatever);
    vstup = (TextView)findViewById(R.id.whatever);
    /* (...) */
}

@Override
public void onSaveInstanceState(Bundle state) {
    super.onSaveInstanceState(state);
    state.putCharSequence(App.VSTUP, vstup.getText());
}

@Override
public void onRestoreInstanceState(Bundle state) {
    super.onRestoreInstanceState(state);
    vstup.setText(state.getCharSequence(App.VSTUP));
}

Fragments ile, bu çok özel durumlarda çalışır. Özellikle, korkunç sonları ne bir parçası yerine, yığın geri koyarak ve daha sonra yeni bölümü görülürken, ekran döner. Ne anladım, eski parça değil almak bir çağrı onSaveInstanceState() ne zaman dolduruluyor ama kalacak bir şekilde bağlı Activity ve bu yöntemi çağrıldıktan sonra kendi View yok artık, o yüzden arıyorum hiç benim TextViews sonuçlara bir NullPointerException.

Ayrıca, eğer sorun olsaydı bile benim için referans TextViews tutmak Fragments ile iyi bir fikir olduğunu buldum Activityile's. Bu durumda, onSaveInstanceState() ben aslında devlet ama sorun belirirse kaydeder ekranı döndürüniki kezparça, onCreateView() onun gibi gizli yeni örneği olarak değil.

Bundletipi bir sınıfın üye elemanı (aslında daha fazla veri, sadece 20 ** biri) onDestroyView() devlet tasarruf ve Tasarruf düşündümbuonSaveInstanceState() ama orada başka bir dezavantajı. Öncelikle, parça halindeşu anda gösterilen iki işlevi çağırma amacıyla iki farklı durum için hesap gerekir diye ters. Temiz ve doğru bir çözüm yolu olmalı!

CEVAP
16 HAZİRAN 2013, Pazar


Doğru Parçasının örneğini durumunu kaydetmek için aşağıdaki kodları yapmalıdır:

  1. Bölümü örneği geçersiz kılmak onSaveİnstanceState tarafından durumunu kaydetmek ve onActivityCreated geri yükleme:

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        ...
        if (savedInstanceState != null) {
            //Restore the fragment's state here
        }
    }
    ...
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    
    
    //Save the fragment's state here
    
    }
  2. Veönemli bir noktaaktivite, onSaveİnstanceState üzerine parçanın örneğini kaydedin ve onCreate üzerine geri yüklemek zorunda.

    public void onCreate(Bundle savedInstanceState) {
        ...
        if (savedInstanceState != null) {
            //Restore the fragment's instance
            mContent = getSupportFragmentManager().getFragment(
                        savedInstanceState, "mContent");
            ...
        }
        ...
    }
    
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    
    
    //Save the fragment's instance
    getSupportFragmentManager().putFragment(outState, "mContent", mContent);
    
    }

Bu yardım umut.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Khan Academy

    Khan Academy

    17 Kasım 2006
  • LinusTechTips

    LinusTechTip

    25 Kasım 2008
  • Mr. H

    Mr. H

    1 Temmuz 2012