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!
OMG, stavo avendo un problema simile per mesi, ho persino perso la speranza nel risolverlo, ed è stato così facile! –