2012-03-07 15 views
5

Ho alcune pagine (frammenti) in un viewPager.
Quando ho cercato di rimuovere (per esempio) il primo, in questo modo:Impossibile modificare il tag del frammento

mFragmentManager.beginTransaction().remove(Page1).commit(); 

si dice che

IllegalStateException has occured. 

non so perché. Qualcuno potrebbe aiutarmi? Grazie.

Eccezione:

java.lang.IllegalStateException: Can't change tag of fragment Page2{40586418 #2 id=0x7f080006 android:switcher:2131230726:2}: was android:switcher:2131230726:2 now android:switcher:2131230726:1 
+0

possibile duplicato di [Android: impossibile sostituire un frammento con un altro] (http://stackoverflow.com/questions/5907673/android-cant-replace-one-fragment-with-another) – bernie

+0

La traccia di eccezioni potrebbe aiutare . La stessa cosa mi sta succedendo, non sulla rimozione, però, su ViewPager.setCurrentItem (int). –

+0

Cosa intendi per rimuovere il frammento da ViewPager. ViewPager gestisce la vita di Fragment.Devi rimuovere elementi come quelli che dovresti rimuovere in una listview, usando i metodi dell'adattatore. Puoi chiarire per favore? –

risposta

2

Questa è una vecchia questione, ma in ogni caso ecco alcune informazioni nella speranza che possa aiutare qualcuno.

ViewPager funziona insieme all'adattatore impostato tramite ViewPager # setAdapter(). Nel caso di questa domanda, sembra che FragmentPagerAdapter sia usato come un adattatore (dato che questo adattatore chiama i frammenti android: switcher: [x]: [y] come appare nell'eccezione).

Un importante osservazione sul FragmentPagerAdapter è questo:

FragmentPagerAdapter possiede i frammenti assegnati che vengono utilizzati nel ViewPager.

L'uso di ViewPager con congiunzione di ViewPagerAdapter deve definire una sottoclasse di FragmentPagerAdapter attuazione del metodo getItem(), prototipo come segue:

public abstract Fragment getItem(int position); 

Questa funzione crea i diversi frammenti utilizzati dalla ViewPager come pagine . L'implementazione di questo metodo dovrebbe essere considerata come un servizio fornito dalla sottoclasse a FragmentPagerAdapter() per l'allocazione dei frammenti.

In altre parole, sebbene la sottoclasse allochi i frammenti non ne è il proprietario.

Poiché, come detto sopra, il proprietario dei frammenti è FragmentPagerAdapter, tutte le operazioni sui frammenti (nel senso di FragmentManager/FragmentTransaction) devono essere eseguite solo da FragmentPagerAdapter.

Provare a eseguire operazioni su questi frammenti può interferire con il normale funzionamento di ViewPager e causare un comportamento indefinito.

Nel caso di questa domanda, vi è un tentativo di rimuovere uno dei frammenti utilizzati dal ViewPager al di fuori di FragmentPagerAdapter che, come spiegato, è errato e probabilmente ha attivato una sequenza terminata con questa eccezione.

Quando è necessario rimuovere/aggiungere/sostituire dinamicamente le pagine in un ViewPager, il modo per farlo è chiamare notifyDataSetChanged() sull'adattatore.

Buona fortuna!

Problemi correlati