2013-02-25 9 views
5

Po pierwsze, wiem, że te tematy zostały stworzone dużo czasu na stackoverflow, ale nie znalazłem rozwiązania moich problemów . Po drugie, jestem Francuzem, więc mój angielski nie jest doskonały, przepraszam z góry i powiedz mi, jeśli czegoś nie rozumiesz. I na zakończenie tego wstępu, po raz pierwszy mam do czynienia z fragmentami, więc przykro mi, jeśli jest coś, czego nie rozumiem!Radzenie sobie z fragmentem i widok pager: nie można zmienić znacznika fragmentu I rekursywnego wpisu do executePendingTransactions

Mam trzy przyciski, które umożliwiają przełączanie między trzema fragmentami. Wewnątrz jednego z tych fragmentów mam pager widoku z dwoma fragmentami. Na razie każdy fragment (jest ich 5) zawiera tylko TextView. Używam najnowszej wersji Androida-support-v4 (Przeczytałem wiele tematów w stackoverflow, które mówią, że najnowsza wersja wsparcia rozwiązuje problem "Rekursywnego wpisu do executePendingTransactions", który mam).

Moje dwa problemy:

  • Kiedy klikam dwa razy w ciągu jednego przycisku, mam IllegaleStateException „Nie można zmienić znacznik fragmentu”. Udało mi się to naprawić, tworząc nowy fragment w metodzie onButtonSelected, ale nie chcę odtwarzać fragmentu za każdym razem, ze względu na pamięć i ze względów funkcjonalnych: fragment musi zachować swój stan. Ten problem nie jest moim głównym problemem. Wiem, że wyłączenie przycisku, gdy użytkownik jest już na fragmencie, jest możliwe, ale dziwne jest mieć wyjątek, kiedy to zarządzanie nie jest wykonywane, nie?

  • Kiedy wychodzę z fragmentu przy pomocy pager widoku i wracam do tego fragmentu, mam wyjątek IllegalStateException "Rekursywny wpis do executePendingTransactions". Mogę to naprawić, ustawiając mój adapter na module obsługi lub używając FragmentStatePagerAdapter zamiast fragmentu FragmentPageAdapter (zobacz Display fragment viewpager within a fragment), ale nawet jeśli moja aplikacja się nie zawiesza, po powrocie do fragmentu za pomocą pagera widoku pager widoku znika !

Czy możesz mi pomóc?

Kod źródłowy Java jest poniżej, kod źródłowy układu jest, jak sądzę, bezużyteczny.

główną działalność:

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 dwa i trzy tylko napompować układ, który zawiera tylko TextView. Fragment jednego (zauważ, że używam DirectionalViewPager - lib - zamiast 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(); 
} 

} 

Dzięki za góry za pomoc!

Odpowiedz

3

Rozwiązałem mój problem!

Po prostu zamieniłem getSupportFragmentManager() na FragmentOne na getChildFragmentManager(). Następnie poddałem edycji moją metodę onButtonSelected, tworząc nowe wystąpienie fragmentu za każdym razem, zamiast używać trzech różnych instancji (jeśli tego nie zrobię, mam wyjątek: java.lang.IllegalStateException: Activity has been destroyed).

Nadal mam problem z tym rozwiązaniem: tracę stan każdego fragmentu za każdym razem, gdy przełączam się między fragmentOne, fragmentTwo i fragmentThree. Czy masz na to rozwiązanie?

+1

OMG, miałem podobny problem od miesięcy, straciłem nawet nadzieję na naprawienie tego i było to takie proste! –

Powiązane problemy