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.
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. –