How to implement a ViewPager with different Fragments / Layouts

前端 未结 6 815
失恋的感觉
失恋的感觉 2020-11-22 00:32

When I start an activity which implements viewpager, the viewpager created various fragments. I want to use different layouts for each fragment, but the problem is that view

6条回答
  •  盖世英雄少女心
    2020-11-22 01:03

    Basic ViewPager Example

    This answer is a simplification of the documentation, this tutorial, and the accepted answer. It's purpose is to get a working ViewPager up and running as quickly as possible. Further edits can be made after that.

    enter image description here

    XML

    Add the xml layouts for the main activity and for each page (fragment). In our case we are only using one fragment layout, but if you have different layouts on the different pages then just make one for each of them.

    activity_main.xml

    
    
    
        
    
    
    

    fragment_one.xml

    
    
    
        
    
    
    

    Code

    This is the code for the main activity. It includes the PagerAdapter and FragmentOne as inner classes. If these get too large or you are reusing them in other places, then you can move them to their own separate classes.

    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentPagerAdapter;
    import android.support.v4.view.ViewPager;
    
    public class MainActivity extends AppCompatActivity {
    
        static final int NUMBER_OF_PAGES = 2;
    
        MyAdapter mAdapter;
        ViewPager mPager;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mAdapter = new MyAdapter(getSupportFragmentManager());
            mPager = findViewById(R.id.viewpager);
            mPager.setAdapter(mAdapter);
        }
    
        public static class MyAdapter extends FragmentPagerAdapter {
            public MyAdapter(FragmentManager fm) {
                super(fm);
            }
    
            @Override
            public int getCount() {
                return NUMBER_OF_PAGES;
            }
    
            @Override
            public Fragment getItem(int position) {
    
                switch (position) {
                    case 0:
                        return FragmentOne.newInstance(0, Color.WHITE);
                    case 1:
                        // return a different Fragment class here
                        // if you want want a completely different layout
                        return FragmentOne.newInstance(1, Color.CYAN);
                    default:
                        return null;
                }
            }
        }
    
        public static class FragmentOne extends Fragment {
    
            private static final String MY_NUM_KEY = "num";
            private static final String MY_COLOR_KEY = "color";
    
            private int mNum;
            private int mColor;
    
            // You can modify the parameters to pass in whatever you want
            static FragmentOne newInstance(int num, int color) {
                FragmentOne f = new FragmentOne();
                Bundle args = new Bundle();
                args.putInt(MY_NUM_KEY, num);
                args.putInt(MY_COLOR_KEY, color);
                f.setArguments(args);
                return f;
            }
    
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                mNum = getArguments() != null ? getArguments().getInt(MY_NUM_KEY) : 0;
                mColor = getArguments() != null ? getArguments().getInt(MY_COLOR_KEY) : Color.BLACK;
            }
    
            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) {
                View v = inflater.inflate(R.layout.fragment_one, container, false);
                v.setBackgroundColor(mColor);
                TextView textView = v.findViewById(R.id.textview);
                textView.setText("Page " + mNum);
                return v;
            }
        }
    }
    

    Finished

    If you copied and pasted the three files above to your project, you should be able to run the app and see the result in the animation above.

    Going on

    There are quite a few things you can do with ViewPagers. See the following links to get started:

    • Creating Swipe Views with Tabs
    • ViewPager with FragmentPagerAdapter (CodePath tutorials are always good)

提交回复
热议问题