2013-02-25 13 views
5

In primo luogo, so che questi argomenti sono stati creati molto tempo su StackOverflow, ma non ho trovato la soluzione ai miei problemi . In secondo luogo, io sono francese, quindi il mio inglese non è perfetto, mi dispiace per anticipo e dimmi se non capisci qualcosa. E per finire questa introduzione, è la prima volta che mi occupo di frammenti, quindi scusa se c'è qualcosa che non ho capito bene!Gestione del frammento e visualizzazione del pager: impossibile modificare il tag del frammento AND Accesso ricorsivo per executePendingTransactions

Ho tre pulsanti, che consentono di passare tra tre frammenti. All'interno di uno di questi frammenti, ho un cercapersone con due frammenti. Per il momento, ogni frammento (ce ne sono 5), contiene solo un TextView. Sto usando l'ultima versione di android-support-v4 (ho letto un sacco di argomenti in StackOverflow che dicono che l'ultima versione del supporto risolve l'errore "Recursive entry executePendingTransactions" che ho).

miei due problemi:

  • quando clicco due volte in un pulsante, ho un IllegaleStateException "non può cambiare tag del frammento". Sono riuscito a risolverlo creando un nuovo frammento sul metodo onButtonSelected, ma non voglio ricreare frammenti ogni volta, per motivi di memoria e per motivi funzionali: il frammento deve mantenere il suo stato. Questo problema non è il mio problema principale, anzi, so che disabilitare il pulsante quando l'utente è già in frammento è possibile, ma è strano avere un'eccezione quando questa gestione non viene eseguita, no?

  • Quando esco dal frammento con la visualizzazione del cercapersone e torno a questo frammento, ho un IllegalStateException "Voce ricorsiva per executePendingTransactions". Posso risolvere questo problema impostando il mio adattatore su un gestore, o usare FragmentStatePagerAdapter invece di FragmentPageAdapter (vedi Display fragment viewpager within a fragment), ma anche se la mia applicazione non si arresta in modo anomalo, quando torno al mio frammento con il pager della vista, il cercapersone della vista è scomparso !

Potete aiutarmi?

Il codice sorgente Java è sotto, il codice sorgente del layout è, penso, inutile.

MainActivity:

public class MainActivity extends SherlockFragmentActivity{ 

private SherlockFragment fragmentOne, fragmentTwo, fragmentThree; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

//  this.fragmentOne = new fragmentOne(); 
//  this.fragmentTwo = new fragmentTwo(); 
//  this.fragmentThree = new fragmentThree(); 
// Call new or instanciate ? What's the correct way ? 

    this.fragmentOne = (SherlockFragment) SherlockFragment.instantiate(this, FragmentOne.class.getName()); 
    this.fragmentTwo = (SherlockFragment) SherlockFragment.instantiate(this, FragmentTwo.class.getName()); 
    this.fragmentThree = (SherlockFragment) SherlockFragment.instantiate(this, FragmentThree.class.getName()); 

    // Add fragment 
    FragmentTransaction transaction = (
     this.getSupportFragmentManager().beginTransaction() 
    );  
    transaction.add(
     R.id.tab_fragment, 
     this.fragmentOne, 
     this.fragmentOne.toString() 
    ); 
    transaction.commit(); 

} 

public void onButtonSelected(View v){ 

    switch (v.getId()){ 

     case R.id.button_one_tab:{ 
      showFragment(this.fragmentThree); 
      break; 
     } 
     case R.id.button_two_tab:{ 
      showFragment(this.fragmentOne); 
      break; 
     } 
     case R.id.button_three_tab:{ 
      showFragment(this.fragmentTwo); 
      break; 
     } 
     default:{ 
      break; 
     } 

    } 

} 

public void showFragment(SherlockFragment fragmentToShow){ 

    FragmentTransaction transaction = (
     this.getSupportFragmentManager().beginTransaction() 
    ); 

    transaction.replace(R.id.tab_fragment, fragmentToShow, fragmentToShow.toString()); 
    transaction.commit(); 

} 

} 

Frammento due e tre solo gonfiare un formato che contiene solo TextView. Frammento uno (notare che io sto usando un DirectionalViewPager - un lib - invece di un ViewPager):

public class FragmentOne extends SherlockFragment{ 

private FragmentOneAdapter fragmentOneAdapter; 

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 

    super.onActivityCreated(savedInstanceState); 

    // Set up the pager 
    final DirectionalViewPager pager = (DirectionalViewPager)getActivity().findViewById(R.id.pager); 
    if (this.fragmentOneAdapter== null){ 
     this.fragmentOneAdapter= new FragmentOneAdapter (getActivity().getSupportFragmentManager()); 
    } 
    pager.setAdapter(fragmentOneAdapter); 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.fragment_landing_page, container, false); 
} 

FragmentOneAdapter:

public class FragmentOneAdapter extends FragmentPagerAdapter{ 

private ArrayList<SherlockFragment> fragmentsList; 

public FragmentOneAdapter(FragmentManager fragmentManager) { 

    super(fragmentManager); 

    SherlockFragment fragmentFour = new FragmentFour(); 
    SherlockFragment fragmentFive = new FragmentFive(); 

    this.fragmentsList = new ArrayList<SherlockFragment>(); 
    this.fragmentsList.add(fragmentFour); 
    this.fragmentsList.add(fragmentFive); 

} 

@Override 
public Fragment getItem(int position) { 
    return this.fragmentsList.get(position); 
} 

@Override 
public int getCount() { 
    return this.fragmentsList.size(); 
} 

} 

Grazie per anticipo per il vostro aiuto!

risposta

3

Ho risolto il mio problema!

Ho semplicemente sostituire getSupportFragmentManager() su FragmentOne a getChildFragmentManager(). Quindi, ho modificato il metodo del mio onButtonSelected creando ogni volta una nuova istanza di frammento invece di utilizzare le mie tre diverse istanze (se non lo faccio, ho un'eccezione: java.lang.IllegalStateException: Activity has been destroyed).

Ho ancora un problema con questa soluzione: perdo lo stato di ogni frammento ogni volta che passaggio tra fragmentOne, fragmentTwo e fragmentThree. Hai una soluzione per questo?

+1

OMG, stavo avendo un problema simile per mesi, ho persino perso la speranza nel risolverlo, ed è stato così facile! –

Problemi correlati