2013-07-05 13 views
10

Sto avendo un problema davvero strano. Ho un frammento comune che viene aggiunto in quasi tutte le attività della mia app. Questo frammento mostra una versione ridotta della barra del player. Quindi ascolta alcune trasmissioni per aggiornare il nome della musica corrente e ha alcuni controlli, come play/pause.Ottenere "Frammento non ha creato una vista" dopo l'aggiunta di altri frammenti senza interfaccia utente

Come ho detto, aggiungo questo frammento in quasi tutte le attività della mia app e non ho mai avuto alcun problema con esso. Ma ora, avevo bisogno di creare un nuovo frammento che non avesse un'interfaccia utente e che venisse mantenuto (setRetainInstance (true)). Dopo l'aggiunta di questo nuovo frammento, tutto sembrava essere ok. Fino a quando non ho ruotato il dispositivo e l'attività si è bloccata.

Così, guardando nel registro, vedo la seguente eccezione:

07-05 14:10:23.818: ERROR/AndroidRuntime(25922): FATAL EXCEPTION: main 
     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.soongz/com.soongz.ui.PlaylistActivity}: android.view.InflateException: Binary XML file line #13: Error inflating class fragment 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135) 
     at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3576) 
     at android.app.ActivityThread.access$800(ActivityThread.java:140) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1243) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4921) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 
     at dalvik.system.NativeStart.main(Native Method) 
     Caused by: android.view.InflateException: Binary XML file line #13: Error inflating class fragment 
     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704) 
     at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
     at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:313) 
     at com.actionbarsherlock.internal.ActionBarSherlockNative.setContentView(ActionBarSherlockNative.java:119) 
     at com.actionbarsherlock.app.SherlockFragmentActivity.setContentView(SherlockFragmentActivity.java:262) 
     at net.simonvt.menudrawer.MenuDrawer.setContentView(MenuDrawer.java:964) 
     at com.soongz.ui.BaseComMenuActivity.setContentViewComMenu(BaseComMenuActivity.java:31) 
     at com.soongz.ui.PlaylistActivity.createView(PlaylistActivity.java:111) 
     at br.com.cybereagle.androidlibrary.ui.EagleActivity.onCreate(EagleActivity.java:57) 
     at android.app.Activity.performCreate(Activity.java:5206) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074) 
     ... 12 more 
     Caused by: java.lang.IllegalStateException: Fragment com.soongz.ui.fragment.PlayerReduzidoFragment did not create a view. 
     at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:303) 
     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:676) 
     ... 26 more 

Questa eccezione sta accadendo nel frammento che era già in attività, invece che accade nel nuovo frammento. Se rimuovo il frammento con la versione ridotta della barra del lettore e conservo il nuovo frammento senza interfaccia utente, tutto funziona normalmente. Funziona anche se tengo solo il vecchio frammento e rimuovo quello nuovo.

Ulteriori dettagli: Il vecchio frammento viene aggiunto tramite il layout XML. Ecco l'XML della attività:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent"> 

    <fragment 
     android:name="com.soongz.ui.fragment.ListaDeMusicasFragment" 
     android:id="@+id/lista_de_musicas_fragment" 
     style="?layoutListViewMusicas" /> 

    <fragment 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:name="com.soongz.ui.fragment.PlayerReduzidoFragment"/> 
</LinearLayout> 

Il nuovo frammento (wih senza UI) viene aggiunto nel seguente modo:

FragmentManager fragmentManager = getSupportFragmentManager(); 
operacoesEmBackgroundFragment = (OperacoesEmBackgroundFragment) fragmentManager.findFragmentByTag(TAG_OPERACOES_EM_BACKGROUND_FRAGMENT); 

if(operacoesEmBackgroundFragment == null){ 
    operacoesEmBackgroundFragment = new OperacoesEmBackgroundFragment(); 
    fragmentManager.beginTransaction() 
      .add(operacoesEmBackgroundFragment, TAG_OPERACOES_EM_BACKGROUND_FRAGMENT) 
      .commit(); 
} 

Grazie in anticipo per tutti coloro che mi può aiutare.

UPDATE:

ho rimosso il setRetainInstance (true) dal frammento con alcuna interfaccia utente per vedere se il problema è relativo a questo. Ma il problema si sta ancora verificando.

risposta

17

Oh mio Dio, non posso credere. Ho risolto il mio problema impostando semplicemente l'ID del frammento che stava avendo problemi.

Ora, il layout della XML del Activity è come questo:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:orientation="vertical" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent"> 

    <fragment 
     android:name="com.soongz.ui.fragment.ListaDeMusicasFragment" 
     android:id="@+id/lista_de_musicas_fragment" 
     style="?layoutListViewMusicas" /> 

    <fragment 
     android:id="@+id/player_reduzido_fragment" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:name="com.soongz.ui.fragment.PlayerReduzidoFragment"/> 
</LinearLayout> 

non so perché. Deve essere un bug.

+4

Se si aggiunge il frammento a livello di codice tramite FragmentTransaction, assicurarsi di fornire al contenitore dei frammenti un ID. Anche @FernandoCamargo non posso descrivere quanto sono grato per questa soluzione rapida, grazie. –

Problemi correlati