Работа с фрагментом и пейджером просмотров: не может изменить тег фрагмента И рекурсивная запись в executePendingTransactions

Во-первых, я знаю, что эти темы были созданы много времени на stackoverflow, но я не нашел решение своих проблем. Во-вторых, я французский, поэтому мой английский не идеален, извините за аванс и скажите, если вы что-то не понимаете. И чтобы закончить это введение, я впервые сталкиваюсь с фрагментами, поэтому, извините, если есть что-то, что я не очень понимаю!

У меня есть три кнопки, которые позволяют переключаться между тремя фрагментами. Внутри одного из этих фрагментов у меня есть пейджер с двумя фрагментами. На данный момент каждый фрагмент (есть 5) содержит только TextView. Я использую последнюю версию android-support-v4 (я прочитал много статей в stackoverflow, которые говорят, что последняя версия поддержки разрешает ошибку «Рекурсивная запись для выполненияPendingTransactions», которая у меня есть).

Мои две проблемы:

Вы можете мне помочь ?

Исходный код Java ниже, исходный код макета, я думаю, бесполезен.

Основная деятельность :

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

Фрагмент два и три только раздувают макет, который содержит только TextView. Фрагмент один (обратите внимание, что я использую DirectionalViewPager – lib – вместо 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(); } } 

Спасибо за аванс за вашу помощь!

Я решил свою проблему!

Я просто заменил getSupportFragmentManager() на FragmentOne на getChildFragmentManager() . Затем я редактировал свой onButtonSelected , создавая новый экземпляр фрагмента каждый раз вместо использования трех разных экземпляров (если я этого не делаю, у меня есть исключение: java.lang.IllegalStateException: Activity has been destroyed ).

У меня все еще есть проблема с этим решением: я теряю состояние каждого фрагмента каждый раз, когда я переключаюсь между fragmentOne , fragmentTwo и fragmentThree . У вас есть решение для этого?