资讯专栏INFORMATION COLUMN

利用TabLayout+ViewPager+Fragment实现首页侧滑

chenatu / 1322人阅读

摘要:一简介使用起来就是我们通过创建给它填充多个,左右滑动时,切换不同的。

一、简介
Viewpager使用起来就是我们通过创建adapter给它填充多个view,左右滑动时,切换不同的view。Google官方是建议我们使用Fragment来填充ViewPager的,这样 可以更加方便的生成每个Page,以及管理每个Page的生命周期
二、引入相关依赖
implementation "com.android.support:design:28.0.0"

三、效果图

四、代码实现

xml



   

activity中通过id来寻找控件

 viewPager = findViewById(R.id.viewPager);
 tabLayout = findViewById(R.id.tabLayout);

创建ViewPager适配器

 public class PageAdapter extends FragmentPagerAdapter {

   List fragmentList = new ArrayList<>();
   List titleList = new ArrayList<>();

   public PageAdapter(FragmentManager fm,List fragmentList,List titleList) {
       super(fm);
       this.fragmentList = fragmentList;
       this.titleList = titleList;
   }

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

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

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

准备相关数据(fragment,title)

 private List getTitleList() {
       titleList.add("Tab1");
       titleList.add("Tab2");
       return titleList;
   }
 private List getFragmentList() {

       pageModels.add(new PageModel(R.layout.examplelayout1));
       pageModels.add(new PageModel(R.layout.examplelayout2));

       for (int i = 0; i < pageModels.size(); i++) {
           pageFragment = PageFragment.newInstance(pageModels.get(i).exampleLayoutRes);
           fragmentList.add(pageFragment);
       }
       return fragmentList;
   }

   class PageModel {
       @LayoutRes
       int exampleLayoutRes;

       public PageModel(@LayoutRes int exampleLayoutRes) {
           this.exampleLayoutRes = exampleLayoutRes;
       }
   }

设置viewPager适配器

 viewPager.setAdapter(new PageAdapter(getSupportFragmentManager(), getFragmentList(), getTitleList()));

设置tab标题

如果不设置此项,tab将无法显示

 tabLayout.setupWithViewPager(viewPager);
 

五、附上源码

布局相关:

activity_main




    

    




fragment_page




    


examplelayout1




    



examplelayout2




    



功能代码

MainActivity

public class MainActivity extends AppCompatActivity {
    ViewPager viewPager;
    TabLayout tabLayout;
    List titleList = new ArrayList<>();
    List fragmentList = new ArrayList<>();
    List pageModels = new ArrayList<>();
    PageFragment pageFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        doBisness();
    }

    private void doBisness() {
        viewPager = findViewById(R.id.viewPager);
        tabLayout = findViewById(R.id.tabLayout);
        viewPager.setAdapter(new PageAdapter(getSupportFragmentManager(), getFragmentList(), getTitleList()));

        tabLayout.setupWithViewPager(viewPager);
    }

    private List getTitleList() {
        titleList.add("Tab1");
        titleList.add("Tab2");
        return titleList;
    }

    private List getFragmentList() {

        pageModels.add(new PageModel(R.layout.examplelayout1));
        pageModels.add(new PageModel(R.layout.examplelayout2));

        for (int i = 0; i < pageModels.size(); i++) {
            pageFragment = PageFragment.newInstance(pageModels.get(i).exampleLayoutRes);
            fragmentList.add(pageFragment);
        }
        return fragmentList;
    }

    class PageModel {
        @LayoutRes
        int exampleLayoutRes;

        public PageModel(@LayoutRes int exampleLayoutRes) {
            this.exampleLayoutRes = exampleLayoutRes;
        }
    }
}

PageFragment

public class PageFragment extends Fragment {

    @LayoutRes
    int exampleLayoutRes;

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     */
    public static PageFragment newInstance(@LayoutRes int exampleLayoutRes) {
        PageFragment fragment = new PageFragment();
        Bundle args = new Bundle();
        args.putInt("exampleLayoutRes", exampleLayoutRes);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            exampleLayoutRes = getArguments().getInt("exampleLayoutRes");
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_page, container, false);
        ViewStub exampleStub = view.findViewById(R.id.exampleViewStub);
        exampleStub.setLayoutResource(exampleLayoutRes);
        exampleStub.inflate();
        return view;
    }

}

PageAdapter

public class PageAdapter extends FragmentPagerAdapter {

    List fragmentList = new ArrayList<>();
    List titleList = new ArrayList<>();

    public PageAdapter(FragmentManager fm,List fragmentList,List titleList) {
        super(fm);
        this.fragmentList = fragmentList;
        this.titleList = titleList;
    }

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

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

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return titleList.get(position);
    }
}
六、项目github地址

https://github.com/fr1014/vie...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72694.html

相关文章

  • Android实现底部状态栏切换

    摘要:开发过程中,特别是新开的项目,底部状态栏的切换使用的频率非常的高,主要的实现方式有这里我先介绍前面两种实现方式,后面两种后期再贴出实现方式。代码地址底部公众号回复底部状态栏切换即可获取。 Android开发过程中,特别是新开的项目,底部状态栏的切换使用的频率非常的高,主要的实现方式有: (1)、TabLayout + Fragment (2)、FragmentTabHo...

    UsherChen 评论0 收藏0
  • TabLayout的简单运用和若干问题的解决

    摘要:初步实现之前在知乎上看到有人对微信的设计改动将使用频率高的朋友圈消息提醒和公众号这三个功能独立出来放在首页。 1、介绍和准备 我们在使用手机App时不难会看到这样的页面上面是一组起导航作用的标签,点击标签就会切换到相应的页面;在不同的页面中滑动时,标签的样式(文字大小或者颜色)也会发生变化。这样你任何时候都能一眼看出自己停留在哪个页面。这个布局出镜率实在太高了,我甚至敢说每个学Andr...

    PiscesYE 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<