Autore Topic: IllegalStateException: Can't change container ID for Fragment ...  (Letto 1244 volte)

Offline Matthew

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
Piattaforma: Android 3.1

Salve,

quando tento di spostare un frammento da un container A a un container B viene sollevata la seguente eccezione a runtime:

03-26 00:13:14.829: E/AndroidRuntime(30090): Caused by: java.lang.IllegalStateException: Can't change container ID of fragment FragmentHomeController{408202a8 id=0x7f050010 HomeController}: was 2131034128 now 2131034132
03-26 00:13:14.829: E/AndroidRuntime(30090):    at android.app.BackStackRecord.doAddOp(BackStackRecord.java:338)
03-26 00:13:14.829: E/AndroidRuntime(30090):    at android.app.BackStackRecord.add(BackStackRecord.java:316)
03-26 00:13:14.829: E/AndroidRuntime(30090):    at app.activity.HomeActivity.reattach(HomeActivity.java:340)
03-26 00:13:14.829: E/AndroidRuntime(30090):    at  app.activity.HomeActivity.customHideShowCreate(HomeActivity.java:253)
03-26 00:13:14.829: E/AndroidRuntime(30090):    at app.activity.HomeActivity.customHideShowCreate(HomeActivity.java:155)
03-26 00:13:14.829: E/AndroidRuntime(30090):    at app.activity.HomeActivity.onPostCreate(HomeActivity.java:66)
03-26 00:13:14.829: E/AndroidRuntime(30090):    at android.app.Instrumentation.callActivityOnPostCreate(Instrumentation.java:1111)
03-26 00:13:14.829: E/AndroidRuntime(30090):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1734)

Il metodo reattach, definito nella HomeActivity, è il seguente:

private void reattach(int newContainerId, Fragment frag, String tag) {
      
      if (frag == null || !frag.isAdded() || (frag.getId() == newContainerId)) { return; }
         
      final FragmentManager fm = getFragmentManager();
      FragmentTransaction ft = fm.beginTransaction();
      ft.remove(frag);     //stacco il frammento dal container A
      ft.commit();
      fm.executePendingTransactions();
      
      ft = fm.beginTransaction();
      ft.add(newContainerId, frag, tag); //attacco il frammento sul container D
      ft.commit();
      fm.executePendingTransactions();   
   }

Il fatto curioso è il problema sorge solo su Honeycomb, mentre su ICS fila tutto liscio. Dopo un veloce debug mi sono accorto che
su Honeycomb, la FragmentTransaction.remove(Fragment frag) non setta a 0 il campo mContainerId di frag - nemmeno dopo la FragmentManager.executePendingTransactions() - causando l'eccezione di cui sopra nel momento in cui tento di "addare" il  frag al container B.  Su ICS, al contrario, mContainerId viene effettivamente settato a 0, come ci si aspetterebbe.

Qualcuno sa darmi una spiegazione plausibile circa tale "stranezza" e, magari, suggerirmi un workaround per il problema in questione?

Grazie in anticipo, : )

Matt

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:IllegalStateException: Can't change container ID for Fragment ...
« Risposta #1 il: 27 Marzo 2012, 19:20:18 CEST »
0
perchè non setti tu a 0 quel valore?
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline Matthew

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
Re:IllegalStateException: Can't change container ID for Fragment ...
« Risposta #2 il: 27 Marzo 2012, 21:58:34 CEST »
0
Non saprei come fare. Quel campo è privato.