it-swarm.com.ru

Как установить ViewPager внутри фрагмента

Мне нужно поместить ViewPager внутри фрагмента, но у меня есть два фрагмента, фрагмент 1 - это мое МЕНЮ, и фрагмент 2, который я хочу использовать в качестве ViewPagerIndicator. 

Но фрагмент не может иметь другой фрагмент ... что мне нужно для этого сделать?

enter image description here

38
Gilberto Ibarra

Начиная с Android 4.2, есть вложенные фрагменты . http://developer.Android.com/about/versions/Android-4.2.html#NestedFragments В библиотеку поддержки теперь также включена поддержка этого для более старых версий Android.

Так что вы можете сделать что-то вроде этого:

@Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    ViewPager mViewPager = (ViewPager) view.findViewById(R.id.viewPager);
    mViewPager.setAdapter(new MyAdapter(getChildFragmentManager()));
    }

Полная реализация доступна здесь: https://github.com/marcoRS/nested-fragments/tree/master/src/com/burnside/digital/nestedfragments

82
Ryan S

Вы должны использовать getChildFragmentManager() вместо getSupportFragmentManager(), чтобы получить FragmentManger внутри фрагмента . Но вы не должны использовать FragmentStatePagerAdapter вместо FragmentPagerAdapter.

27
hawa11

это возможно. попробуйте сделать этот код файл 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);
    }
}
1
mukesh mali

С помощью библиотеки Android Support V4 вы можете добавить фрагмент внутри другого фрагмента. Попробуйте использовать его, это может решить вашу проблему.

0
Kyu_

После прочтения некоторых примеров у вас не может быть FragmentActivity внутри fragActivity . Необязательно иметь два фрагмента, и это должен быть FragmentPageAdapter ... Мне нужно только сделать это. 

<Android.support.v4.view.ViewPager
        Android:id="@+id/pager"
        Android:layout_width="match_parent"
        Android:layout_height="0px"
        Android:layout_weight="1" >
</Android.support.v4.view.ViewPager>

<LinearLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_weight="0"
        Android:gravity="center"
        Android:measureWithLargestChild="true"
        Android:orientation="horizontal" >

<Button
            Android:id="@+id/first"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="First" >
        </Button>

<Button
            Android:id="@+id/last"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:text="Last" >
</Button>
</LinearLayout>

Источник: http://www.truiton.com/2013/05/Android-fragmentpageradapter-example/

0
Gilberto Ibarra

Просто используйте getChildFragmentManager () вместо getSupportFragmentManager () внутри фрагментов.

Внутренние фрагменты

new ViewPagerAdapter(getChildFragmentManager());

Внутренняя деятельность

new ViewPagerAdapter(getSupportFragmentManager());

Простой код

fragment_sample.xml макет

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical">

    <com.google.Android.material.tabs.TabLayout
        Android:id="@+id/tablayout"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" />

    <androidx.viewpager.widget.ViewPager
        Android:id="@+id/viewpager"
        Android:layout_width="match_parent"
        Android:layout_height="0dp"
        Android:layout_weight="1" />

</LinearLayout>

SampleFragment.Java класс

public class SampleFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View fragmentView = inflater.inflate(R.layout.fragment_sample, container, false);
        return fragmentView;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        // find views by id
        ViewPager viewPager = view.findViewById(R.id.viewpager);
        TabLayout tabLayout = view.findViewById(R.id.tablayout);

        // attach tablayout with viewpager
        tabLayout.setupWithViewPager(viewPager);

        ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());

        // add your fragments
        adapter.addFrag(new SampleFragment(), "Tab1");
        adapter.addFrag(new SampleFragment2(), "Tab2");
        adapter.addFrag(new SampleFragment3(), "Tab3");

        // set adapter on viewpager
        viewPager.setAdapter(adapter);
    }
}

ViewPagerAdapter.Java класс

public class ViewPagerAdapter extends FragmentStatePagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

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

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

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

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

    public void addFrag(Fragment fragment) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add("");
    }

    public void addFrag(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }
}

Важные ссылки по теме

0
Khemraj