Подтвердить что ты не робот

Почему нельзя использовать ViewPager внутри фрагмента? Это на самом деле

Есть информация, что невозможно использовать ViewPager внутри Fragment во многих источниках, таких как Руководство для занятых кодеров для разработчиков Android "Марк Мерфи, или сообщения, такие как this на SO. Я смущен, потому что у меня нет такой проблемы, и я успешно использую ViewPager в моей Fragment. Единственное отличие состоит в том, что я создаю экземпляр метода ViewPager не в onCreateView(), а в onActivityCreated(). И все работает отлично.

Итак, вопрос в том, может быть, я просто ничего не знаю, и по какой-то причине не рекомендуется создавать экземпляры пользовательского интерфейса в onActivityCreated()? Но опять же - все работает отлично.

Вот список классов и xml:

Класс:

public class ViewPagerFragment extends Fragment {

    static final int NUM_ITEMS = 2;

    private ViewPagerAdapter mAdapter;
    private ViewPager mPager;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.view_pager_fragment, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        mAdapter = new ViewPagerAdapter(getFragmentManager());

        mPager = (ViewPager) getView().findViewById(R.id.pager);
        mPager.setAdapter(mAdapter);
    }

    public static class ViewPagerAdapter extends FragmentPagerAdapter {
        public ViewPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int num) {
            if (num == 0) {
                return new ItemsListFragment();
            } else {
                return new FavsListFragment();
            }
        }

        @Override
        public int getCount() {
            return NUM_ITEMS;
        }
    }
}

Разметка:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical">

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

</LinearLayout>
4b9b3361

Ответ 1

UPDATE. Поскольку этот ответ был изначально написан, теперь у вас могут быть вложенные фрагменты, что означает, что можно использовать фрагменты ViewPager для страниц и быть в самом фрагменте. Этот примерный проект демонстрирует технику.

Теперь я возвращаю вас к вашему регулярному ответу, представленному в полном объеме...


Цитата из книги:

Самый простой способ использования ViewPager - иметь в нем фрагменты страницы и из нее экран на основе пользовательских проверок. Это работает только в том случае, если сам ViewPager не содержится внутри фрагмента, так как вы не можете иметь фрагменты, вложенные внутри других фрагментов.

Цитата Диана Хакборн:

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

Вполне возможно поставить ViewPager внутри a Fragment, пока содержимое ViewPager сами не содержит фрагментов. Поскольку в конкретных реализациях PagerAdapter, поставляемых пакетом поддержки Android, используются фрагменты, вам нужно свернуть свой собственный фрагмент PagerAdapter, чтобы поместить ViewPager в фрагмент.

Я постараюсь сделать этот пункт более ясным в следующем выпуске книги (если вы не британцы, и в этом случае я постараюсь сделать эту мысль более ясной: -).

Ответ 2

Для реализации пейджера View внутри фрагмента используйте getChildFragmentManager() вместо getFragmentManager(). Вы можете вызвать setAdapter() для ViewPager из onCreateView() или onActivityCreated(), что не имеет значения.

Надеюсь, это поможет вам, ребята.

Ответ 3

При инициализации SetionPageAdapter для ViewPager используйте "getChildFragmentManager()".

mSectionsPagerAdapter = новые разделы PagerAdapter (getChildFragmentManager());

Ответ 4

можно попробовать сделать этот код и сохранить view_pager_fragment.xml

<android.support.design.widget.AppBarLayout
    android:id="@+id/appBarLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.design.widget.TabLayout
        android:id="@+id/tab"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</android.support.design.widget.AppBarLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

ViewPagerFragment

ViewPager viewPager;
TabLayout tabLayout;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.tracks, container, false);

    viewPager = (ViewPager) view.findViewById(R.id.viewpager);
    tabLayout = (TabLayout) view.findViewById(R.id.tab);

    return view;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    setupViewPager(viewPager);
    tabLayout.setupWithViewPager(viewPager);

    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
}

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getChildFragmentManager());``

    viewPagerAdapter.addFragment(new FirstFragment(), "First");
    viewPagerAdapter.addFragment(new SecoundFragment(), "Secound");
    viewPagerAdapter.addFragment(new LoginFragment(), "Login");

    viewPager.setAdapter(viewPagerAdapter);
}

private class ViewPagerAdapter extends FragmentPagerAdapter {

    List<Fragment> fragmentList = new ArrayList<>();
    List<String> fragmentTitles = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager fragmentManager) {
        super(fragmentManager);
    }

    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

    @Override
    public int getCount() {
        return fragmentList.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return fragmentTitles.get(position);
    }

    public void addFragment(Fragment fragment, String name) {
        fragmentList.add(fragment);
        fragmentTitles.add(name);
    }
}