How to set a ViewPager inside a Fragment

后端 未结 6 1319
深忆病人
深忆病人 2020-11-27 12:52

I need to place a ViewPager inside of a fragment, but I have two fragments, Fragment 1 is my MENU, and Fragment 2 I want to use as a ViewPagerIndicator.

But a fragm

相关标签:
6条回答
  • 2020-11-27 13:27

    Starting in Android 4.2, there are nested fragments.http://developer.android.com/about/versions/android-4.2.html#NestedFragments The support library now also includes support for this for older Android versions.

    So you can do something like this:

    @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()));
        }
    

    Full implementation available here: https://github.com/marcoRS/nested-fragments/tree/master/src/com/burnside/digital/nestedfragments

    0 讨论(0)
  • 2020-11-27 13:30

    After Read some examples, you cant have a FragmentActivity inside a fragmentActivity. Is not necesary to have two fragments and this need be a FragmentPageAdapter... i only need to do this.

    <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>
    

    Source: http://www.truiton.com/2013/05/android-fragmentpageradapter-example/

    0 讨论(0)
  • 2020-11-27 13:37

    Just use getChildFragmentManager() instead of getSupportFragmentManager() inside Fragments.

    Inside Fragments

    new ViewPagerAdapter(getChildFragmentManager());
    

    Inside Activity

    new ViewPagerAdapter(getSupportFragmentManager());
    

    Simple Code

    fragment_sample.xml layout

    <?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 class

    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 class

    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);
        }
    }
    

    Important Related Links

    • Difference between getSupportFragmentManager() and getChildFragmentManager()?
    • getSupportFragmentManager() versus getFragmentManager() in android 3.0+
    • Difference between FragmentPagerAdapter and FragmentStatePagerAdapter
    0 讨论(0)
  • 2020-11-27 13:39

    With the Android Support V4 library, you can add a fragment inside another fragment. Try to use it, it may can resolve your problem.

    0 讨论(0)
  • 2020-11-27 13:42

    You must use getChildFragmentManager() instead of getSupportFragmentManager() to get the FragmentManger inside a Fragment. But you should not use FragmentStatePagerAdapter rather than FragmentPagerAdapter.

    0 讨论(0)
  • 2020-11-27 13:52

    it is possible. try to do this code view_pager_fragment.xml file

    <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 讨论(0)
提交回复
热议问题