it-swarm.com.ru

Почему нельзя использовать 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>
36
Eugene

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

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


Цитирую себя из книги:

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

Цитата Дайан Хэкборн

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

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

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

61
CommonsWare

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

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

69
Rajkumar

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

mSectionsPagerAdapter = new SectionsPagerAdapter (getChildFragmentManager ());

4
hims_3009

можно попробовать сделать этот код и сохранить 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);
    }
}
0
mukesh mali