Замена фрагмента / вкладки в Viewpager - PullRequest
6 голосов
/ 02 апреля 2012

Я сейчас пытаюсь сделать фреймворк для своих будущих приложений.Мне действительно нравится ActionBar и ViewPager, но я скучаю по функции.Мне нужно заменить фрагмент / вкладку во время выполнения.

Используя официальный пример , я бы хотел увидеть что-то вроде replaceTab (), но сам фрагмент не обновляется, нетнезависимо от того, что я делаю.

Ответы [ 4 ]

2 голосов
/ 21 марта 2013

Вы должны использовать FragmentPagerAdapter для обработки ваших изменений фрагмента.Есть 3 важных момента:

  • удалить предыдущий фрагмент, если он существует.

  • вызвать notifyDataSetChanged (), чтобы обновить список страниц.

  • вернуть POSITION_NONE в getItemPosition, если он запрашивает старый фрагмент.

Вот код, который я использую с левой и правой страницей.Я динамически меняю фрагменты в зависимости от того, что делает пользователь.

public class MyPager extends ViewPager {

    private MyPagerAdapter mMyPagerAdapter;

    public MyPager(Context context, FragmentActivity activity) {
        super(context);

        mMyPagerAdapter = new MyPagerAdapter(activity.getSupportFragmentManager());
        setAdapter(mMyPagerAdapter);

    }
    public void replaceLeftFragment(Fragment fragment) {
        mMyPagerAdapter.replaceLeftFragment(fragment);
    }
    public void replaceRightFragment(Fragment fragment) {
        mMyPagerAdapter.replaceRightFragment(fragment);
    }
}

public class MyPagerAdapter extends FragmentPagerAdapter {

    private FragmentManager mFragmentManager;
    private Fragment mLeftFragment;
    private Fragment mRightFragment;

    public MyPagerAdapter(FragmentManager fm) {
        super(fm);
        mFragmentManager = fm;
    }

    @Override
    public Fragment getItem(int position) {
        if (position == 0) {
            return mLeftFragment;
        } else {
            return mRightFragment;
        }
    }

    @Override
    public int getCount() {
        final int nbLeft = (mLeftFragment == null) ? 0 : 1;
        final int nbRight = (mRightFragment == null) ? 0 : 1;
        return (nbLeft + nbRight);
    }

    public void replaceLeftFragment(Fragment fragment) {
        if (mLeftFragment != null) {
            mFragmentManager.beginTransaction().remove(mLeftFragment).commit();
        }
        mLeftFragment = fragment;
        notifyDataSetChanged();
    }
    public void replaceRightFragment(Fragment fragment) {
        if (mRightFragment != null) {
            mFragmentManager.beginTransaction().remove(mRightFragment).commit();
        }
        mRightFragment = fragment;
        notifyDataSetChanged();
    }

    @Override
    public int getItemPosition(Object object) {
        if ((object!=mLeftFragment) && (object!=mRightFragment)) {
            return POSITION_NONE;
        }
        return super.getItemPosition(object);
    }

}
1 голос
/ 06 апреля 2012

Вы пытаетесь:

fragmentTransaction.remove(yourframent);

и затем:

fragmentTransaction.add(yournewfragment);
0 голосов
/ 26 декабря 2012

Очень близко к тому, что вы хотите, мне нужно было добавить фрагмент (в конце) в ViewPager, и сделал это:

    FragmentTransaction ft = fragmentManager.beginTransaction();
    new_fragment = Fragment.instantiate(activity, class_name, args);

    // The below code removes old fragment and adds the new one at the end.
    ft.attach(new_fragment);              // <- this adds the fragment at the end
    ft.detach(old_fragment);              // <- this removes old fragment

    // This should be what you're looking for when adding to an Activity instead of a ViewPager
    ft.replace(view_id, new_fragment);    // <- this is supposed to replace the fragment attached to view_id

    // Or if the replace does not work, this might work:
    ft.detach(old_fragment);
    ft.add(view_id, new_fragment);

    // Not to be forgotten: ;)
    ft.commit();

Приведенный выше код может нуждаться в некоторых корректировках, может быть, для эффективной работы требуется только вызов замены?

Если вызов замены не удался, вы все равно можете отсоединить все фрагменты и повторно присоединить их в нужном порядке.

0 голосов
/ 12 апреля 2012

Если ваш Fragment создан из файла макета, вы не можете заменить его во время выполнения. Вы можете только успешно заменить фрагменты, которые вы добавили программно. См. Android: невозможно заменить один фрагмент другим

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...