Динамическая замена фрагмента в ViewPager с помощью TabsAdapter

Я использую ViewPager в сочетании с вкладками ActionBar, как показано здесь . Я использую ActionBarSherlock для обратной совместимости, поэтому родительская активность расширяет SherlockFragmentActivity, а дочерние фрагменты расширяют SherlockFragment.

Решение отлично работает для вкладок со свайпом, но теперь я хочу динамически изменить фрагмент, связанный с одной из вкладок.

Я прочитал множество S.O. ответы на эту тему (например, здесь и здесь), но я не нашел внятного объяснения, как динамически изменять фрагмент при использовании ViewPager + TabsAdapter над.

Вот что у меня есть сейчас. Когда пользователь нажимает кнопку существующего фрагмента, я пытаюсь заменить фрагмент из родительского действия следующим образом:

AnotherFragment fragment = new AnotherFragment();           
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();

int viewId = R.id.pager;                 // resource id of the ViewPager
int position = Constants.TAB_2;          // tab pos of the fragment to be changed

String tag = "android:switcher:" + viewId + ":" + position;

ft.replace(viewId, fragment, tag);
ft.commit();

mTabsAdapter.notifyDataSetChanged();

Это не работает, поэтому я что-то упускаю. Я также пытался сделать это с вложенными фрагментами, используя getChildFragmentManager(), но столкнулся с проблемой, поскольку эта функция недоступна без API 17, Android 4.2.

Спасибо за любую помощь!


comment
Похоже, одна ошибка заключалась в использовании идентификатора ресурса ViewPager, R.id.pager. Я переключил это на идентификатор макета целевого фрагмента, и теперь виден новый фрагмент. Однако старый фрагмент все еще остается видимым на вкладке. Это направление в правильном направлении, или мне нужно попробовать что-то еще?   -  person gcl1    schedule 11.02.2013
comment
ОБНОВЛЕНИЕ: я обновился до API 17 (Android 4.2), чтобы использовать getChildFragmentManager(), как рекомендовал @georgiecasey в ответ на stackoverflow.com/questions/7723964/. Тем не менее, остается нерешенный вопрос, из-за которого старые и новые фрагменты отображаются на вкладке одновременно. Я был бы очень признателен за любой справочный код, который показывает, как использовать вложенные фрагменты с Google TabsAdapter в developer.android.com/reference/android/support/v4/view/. Спасибо.   -  person gcl1    schedule 12.02.2013
comment
Можете ли вы опубликовать код адаптера?   -  person vipul mittal    schedule 30.01.2014


Ответы (1)


Я сделал небольшой пример, который показывает подобное поведение. Я надеюсь, что вы можете использовать его повторно.

Я думаю, что ключ в том, чтобы использовать фрагмент в качестве контейнера и заменить им ваш «настоящий» фрагмент.

Например, посмотрите, как перейти к другому фрагменту:

        btn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            FragmentTransaction trans = getFragmentManager()
                    .beginTransaction();
            /*
             * IMPORTANT: We use the "root frame" defined in
             * "root_fragment.xml" as the reference to replace fragment
             */
            trans.replace(R.id.root_frame, new SecondFragment());

            /*
             * IMPORTANT: The following lines allow us to add the fragment
             * to the stack and return to it later, by pressing back
             */
            trans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
            trans.addToBackStack(null);

            trans.commit();
        }
    });

Вы можете проверить весь пример здесь:

https://github.com/danilao/fragments-viewpager-example

person dlao    schedule 30.01.2014
comment
Обратите внимание, что ответы только по ссылкам не рекомендуются, ответы SO должны быть конечной точкой поиска для решения (по сравнению с еще одной остановкой ссылок, которые со временем устаревают). Пожалуйста, рассмотрите возможность добавления здесь отдельного синопсиса, оставив ссылку в качестве ссылки. - person kleopatra; 30.01.2014