2015-05-18 21 views
9

Geçtiğimiz günlerde, yeniden çoğaltmak zorlukla karşılaştım. NPE, bir parça ArrayAdapter'i Etkinlik'ten verileri başlatmaya çalıştığında oluşur. Etkinlik'ın onCreate yöntemde başlatıldı varsayılan listesi:Neden Fragman'ın onCreate(), bazen Activity'ın onCreate() öğesinden önce çağrılır?

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // ... 
    mAccounts = new ArrayList<>(); 
    // ... 
} 

@Override 
public List<Account> getAccounts(){ 
    return mAccounts; 
} 

fragmanı) olarak onCreate (Aynı zamanda bir liste bağdaştırıcı yarattığı:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setRetainInstance(true); 
    setHasOptionsMenu(true); 

    //mAccountProvider is an interface implemented by the activity 
    mAccounts = mAccountProvider.getAccounts(); 

    mAccountAdapter = new AccountAdapter(getActivity(), R.layout.account_list_item, mAccounts); 
} 

NPE AccountAdapter varsayılan içinde oluşur getCount() yöntemi denir. Nedeni, mAccounts'un boş olmasıdır. Sorun nadiren görünüyor ve bunu yeniden oluşturamadım.

zaman mümkün olduğunu etkinliğin onCreate() önce denir veridiliminin onCreate()? kaynak koduna göre , fragman en onCreate() etkinlik'ın onCreate() olarak gönderilir. Aktivite onCreate() çalışmasını bitirdikten sonra neden çağrılır? etkinlik onCreate() yöntemi bittikten önce parçanın

+0

hayır mümkün değildir. – Blackbelt

+0

Fragmanınızın etkinliğinizde nasıl göründüğü hakkında daha fazla kod yayınlamalısınız. – jobcrazy

+0

@Ilya Vorobiev ile aynı fikirdeyim. Etkinliğin super.onCreate() öğesi çağrıldığında parçanın onCreate() öğesi gönderilir. Sorun, çoğu durumda, Faaliyetin onCreate'dan sonra yürütülmesidir. – Zzokk

cevap

5

onCreate() çağrılabilir. Parçanızda onActivityCreated() geri arama var ve onCreateView(). Herhangi birini kullanabilirsiniz - onCreate etkinlik yönteminden sonra yürütülür.

+0

Kesin şartları biliyor musunuz? Bahsettiğim gibi konu nadiren yeniden üretildi. – Zzokk

+0

Bu sorunun gerçekleştiği birçok durum var. FragmentActivity'nin onCreate() yöntemine bir göz attığınızda, bu etkinliğin önce kendini parçalara eklediğini görürsünüz, sonra super.onCreate() işlevini yürütür. Bu nedenle, kodunuzun, parçanızın onCreate() öğesinden önce yürütülmesi garanti edilmez. –

+0

Sorun gerçekten% 100 yeniden üretilebilir olduğunda bunu anlayacağım çünkü gerçekten parçamın onCreate() öğesi etkinliğin onCreate() 'ından önce çağrıldı. Sanırım soruyu düzenlemeliyim. Tersine çevrilmelidir. Activty's onCreate() uygulamasında gönderilse bile, neden fragmanın onCreate() öğesi activiy'in onCreate() öğesinden sonra çağrılır. – Zzokk

6

Faaliyetler Fragmanlardan sonra geri aranamaz; Faaliyetin Parçası'nın adı verilir.

initialise mAccountsActivity.onCreate()

+0

Bahşiş için teşekkürler. Sorunu çözmenin kesinlikle birkaç yolu vardır. Soru, davranışın neden farklı olduğudur. OnCreate() yöntemi tam olarak nasıl tetiklenir ve bazen neden etkinlik onCreate() öğesinin ardından gerçekleşir. – Zzokk

2

yılında super.onCreate() çağırmadan önce Bu hata geliştirici seçeneklerinde "dont't faaliyetlerini tutmak" açarak yeniden yapılabilir. Ben de benzer bir sorunla karşılaştım ve FunkTheMonk tarafından sağlanan çözümü kullanarak çözdüm.

1

Kısa bir süre önce sorunla karşılaştı. Alttaki yığın izine bakın.

FunkTheMonk'un belirttiği gibi, kilitlenme, sizin Faaliyetinizdeki özelleştirilmiş onCreate() kodunuzun (super.onCreate() öğesinden hemen sonra) Fragmanınızda özelleştirilmiş onCreate() kodunuzdan sonra yürütüldüğünden kaynaklanır (hemen ardından super.onCreate())

gerçekten geri arama promisingly bütün etkinlik'ın onCreate (sonra infaz edilmesi gerekiyorsa), bellek olduğunda Aksi yukarıda bahsedilen durum ne olacak onActivityCreated() yerine

onCreate() daha da kod parçalarını koymak Düşük ve aktivite geri dönüştürülür. Benim MyActivity bir niyeti gönderdiğinde Anahtarı geri basarak MyFragment döndü zamanlar benim deneyim Başına

App çöküyor.

Caused by: java.lang.NullPointerException 
    at MyFragment.onCreate(MyFragment.java:20) 
    at android.support.v4.app.Fragment.performCreate(Fragment.java:1939) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1029) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1248) 
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1230) 
    at android.support.v4.app.FragmentManagerImpl.dispatchCreate(FragmentManager.java:2037) 
    at android.support.v4.app.FragmentController.dispatchCreate(FragmentController.java:154) 
    at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:289) 
    at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:58) 
    at MyActivity.onCreate(MyActivity.java:129) 
    at android.app.Activity.performCreate(Activity.java:5248) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1110) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2162) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2257) 
    at android.app.ActivityThread.access$800(ActivityThread.java:139) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1210) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5086) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
    at dalvik.system.NativeStart.main(Native Method) 
0

Yanıtlamak için çok geç olabilir, ancak yine de. Bununla birkaç gün önce karşılaştım.Dinamik parçaları kullandığınızda ve düzende parçayı görüntülemek için parça etiketini kullandığınızda olur. Bunun yerine bir Layout (tercihen FrameLayout) kullanın. Destek parçası kütüphanesini kullandığınızı varsayalım.

Denemeye değer.

İlgili konular