Autore Topic: Dopo la rotazione, No view found for id 0x7f0b004e for fragment  (Letto 533 volte)

Offline Gianluca

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S-II (i9100)
  • Sistema operativo:
    Windows 8
Dopo la rotazione, No view found for id 0x7f0b004e for fragment
« il: 14 Agosto 2013, 19:32:35 CEST »
0
Ciao ragazzi!

Nell'app che sto sviulppando ho un contenitore iniziale, la home, che contiene alcuni Fragments sui quali ho aggiunto un Navigation Drawer. Tra questi, due sono ViewPager che a loro volta contengono due pagine (Fragments anch'essi, quindi) ciascuno. Quando ruoto lo schermo dell'applicazione, però, e tornando poi allo stato originale in portrait, l'app crasha:

Citazione
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.alfa/com.example.alfa.ActivityHome}: java.lang.IllegalArgumentException: No view found for id 0x7f0b004e (com.example.alfa:id/taxes_pager) for fragment FragmentTaxToBePaid{b5969898 #2 id=0x7f0b004e}

La cosa bugga è che non sto assolutamente tentando di caricare FragmentTaxes (che, attenzione, è uno dei due ViewPager), ma tutto un altro Fragment (FragmentOverwiew).

Anche tornando in portrait dopo aver caricato l'altro ViewPager, FragmentSession, l'app crasha:

Citazione
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.alfa/com.example.alfa.ActivityHome}: java.lang.IllegalArgumentException: No view found for id 0x7f0b000f (com.example.alfa:id/session_pager) for fragment FragmentSessionApplied{b5afa300 #1 id=0x7f0b000f}

Ho tentato QUALUNQUE COSA: settare il retaining instances su false, mettere i fragments nella back stack, sostituire Frame con FrameLayout, creare un layout specifico per il landscape; praticamente nulla è servito.
Credo centri il lifecycle di un Fragment contenuto in un Frame, ma non riesco a debuggare perché non è specificato veramente quale sia di preciso il problema.
Sto schizzando male...

ActivityHome
Codice (Java): [Seleziona]
public void selectItem(int position) {
        // ...
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction()
                    .addToBackStack(null)
                    .replace(R.id.content_frame, fragment)
                    .commit();
    mDrawerList.setItemChecked(position, true);
    setTitle(mDrawerTitles[position]);

    mDrawerLayout.closeDrawer(mDrawerList);
}

activity_home
Codice (XML): [Seleziona]
<android.support.v4.widget.DrawerLayout
   ... >

    <FrameLayout
       android:id="@+id/content_frame"
       android:layout_width="match_parent"
       android:layout_height="match_parent" />


    <!-- The navigation drawer  .... -->

</android.support.v4.widget.DrawerLayout>

FragmentTaxes
Codice (Java): [Seleziona]
    View rootView = inflater.inflate(R.layout.fragment_taxes, container, false);
fragment_taxes
Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
   ... >

    <!-- Loader -->
    <include
       android:id="@+id/taxes_main_progress"
       layout="@layout/indeterminate_activity_bar" />

    <android.support.v4.view.ViewPager
       android:visibility="gone"
       android:id="@+id/taxes_pager"
       ... >

        <android.support.v4.view.PagerTabStrip
           android:id="@+id/taxes_pager_tab_strip"
           ... />
    </android.support.v4.view.ViewPager>

</RelativeLayout>

Se necessario posto altri frammenti di codice, per ora rimango così stringato per non affaticare la lettura con dettagli inutili.


Off-Topic:
Una copia della domanda, alla quale peraltro nessuno ha ancora risposto, è disponibile su SO, se qualcuno volesse contribuire.o volesse contribuire.
« Ultima modifica: 30 Settembre 2013, 20:48:58 CEST da Gianluca »

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Dopo la rotazione, No view found for id 0x7f0b004e for fragment
« Risposta #1 il: 14 Agosto 2013, 19:45:35 CEST »
+1
Il codice postato e parziale e molto probabilmente non riuscirei comunque a individuare il problema in breve tempo.

Però ho trovato (se non lo avevi già visto) un post che cita un problema molto simile al tuo, in un caso anch'esso molto simile (viewpager con framelayout etc). Magari può darti qualche spunto.

android - ViewPager with one page containing multiple Fragments &quot;java.lang.IllegalArgumentException: No view found for id&quot; - Stack Overflow
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Gianluca

  • Nuovo arrivato
  • *
  • Post: 19
  • Respect: +2
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S-II (i9100)
  • Sistema operativo:
    Windows 8
Re:Dopo la rotazione, No view found for id 0x7f0b004e for fragment
« Risposta #2 il: 14 Agosto 2013, 20:14:02 CEST »
0
Ma che spettacolo! Grazie infinite, bradipao!

Era tutto dovuto a setRetainInstance:

Citazione
Nested fragments cannot have setRetainInstance(true), or it will get:
java.lang.IllegalStateException: Can't retain fragements that are nested in other fragments
.

Ora mi domando: se non posso salvare l'istanza del Fragment, come faccio a "salvarlo"?
Citazione
Codice: [Seleziona]
Use setRetainInstance(true), in that case savedInstanceBundle is always null, but that Fragment (as Java object) will not be destroyed and it will still go through onAttach / onCreateView.

In fin dei conti è proprio setRetainInstance(true) che crashava.