2013-02-25 6 views
5

Erstens, ich weiß, diese Themen wurden eine Menge Zeit auf Stackoverflow erstellt, aber ich habe keine Lösung für meine Probleme gefunden . Zweitens, ich bin Französisch, also mein Englisch ist nicht perfekt, sorry per Voraus und sagen Sie mir, wenn Sie etwas nicht verstehen. Und um diese Einführung zu beenden, ist es das erste Mal, dass ich mich mit Fragmenten beschäftige. Entschuldigung, wenn es etwas gibt, das ich nicht gut verstanden habe!Umgang mit Fragment und View Pager: kann Tag des Fragments nicht ändern UND rekursive Eintrag zu executePendingTransactions

Ich habe drei Tasten, mit denen Sie zwischen drei Fragmenten wechseln können. In einem dieser Fragmente habe ich einen View Pager mit zwei Fragmenten. Momentan enthält jedes Fragment (es gibt 5) nur eine Textansicht. Ich benutze die neueste Version von Android-support-v4 (ich habe eine Menge Thema in Stackoverflow gelesen, die sagen, dass die neueste Version der Unterstützung lösen den "Recursive-Eintrag zu executePendingTransactions" Fehler, die ich habe).

Meine zwei Probleme:

  • Wenn ich in einer Taste zweimal auf, ich habe eine IllegaleStateException „kann nicht Tag des Fragments ändern“. Ich konnte das beheben, indem ich ein neues Fragment für die onButtonSelected-Methode erstelle, aber ich möchte das Fragment nicht jedes Mal neu erstellen, aus Gründen des Speichers und aus funktionalen Gründen: Fragment muss ihren Status behalten. Dieses Problem ist nicht mein Hauptproblem, in der Tat, ich weiß, dass die Schaltfläche zu deaktivieren, wenn Benutzer bereits auf Fragment ist möglich, aber es ist seltsam, eine Ausnahme zu haben, wenn diese Verwaltung nicht erfolgt ist, nicht?.

  • Wenn ich aus dem Fragment mit der Ansicht Pager gehen, und ich gehe zurück zu diesem Fragment, ich habe eine IllegalStateException "Recursive-Eintrag zu executePendingTransactions". Ich kann das beheben, indem ich meinen Adapter auf einen Handler setze oder FragmentPlayerAdapter anstelle von FragmentPageAdapter verwende (siehe Display fragment viewpager within a fragment), aber selbst wenn meine Anwendung nicht abstürzt, wenn ich mit dem View Pager zu meinem Fragment zurückgehe, verschwindet der View Pager !

Können Sie mir helfen?

Java-Quellcode ist unten, Layout-Quellcode ist, denke ich, nutzlos.

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(); 

} 

} 

Fragment zwei und drei nur ein Layout aufblasen, die nur eine Textview enthält. Fragment ein (beachten Sie, dass ich ein DirectionalViewPager bin mit - eine lib - anstelle eines 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(); 
} 

} 

Dank pro Voraus für Ihre Hilfe!

Antwort

3

Ich habe mein Problem gelöst!

Ich habe einfach ersetzen getSupportFragmentManager() auf FragmentOne zu getChildFragmentManager(). Dann habe ich meine Methode onButtonSelected bearbeitet, indem ich jedes Mal eine neue Fragmentinstanz erstellt habe, anstatt meine drei verschiedenen Instanzen zu verwenden (wenn ich das nicht tue, habe ich eine Ausnahme: java.lang.IllegalStateException: Activity has been destroyed).

Ich habe immer noch ein Problem mit dieser Lösung: Ich verliere den Zustand jedes Fragments jedes Mal, wenn ich zwischen fragmentOne, fragmentTwo und fragmentThree wechseln. Hast du eine Lösung dafür?

+1

OMG, ich hatte ein ähnliches Problem für Monate, ich verlor sogar die Hoffnung, es zu reparieren, und es war so einfach! –

Verwandte Themen