当前位置:   article > 正文

Fragment的嵌套和侧滑菜单DrawerLayout加标签页的使用_侧边栏嵌套fragment

侧边栏嵌套fragment

先来看一下效果图吧:

             效果图1                                                                                                                             效果图2

标签页用的ToolBar+SlidingTabLayout                                                                     另一种效果:标签页用的PagerTabStrip

                                                                                                                            因为是写的两个demo,所以界面不大一致,但是基本功能差不多,只是标签页的效果不一样。

                      

功能介绍:

1、有侧滑菜单DrawerLayout作为主菜单,可以切换fragment_parent1和fragment_parent2

2、fragment_parent1下又有三个子fragment,通过标签页滑动切换

主要知识点:

1、侧滑菜单:DrawerLayout

2、fragment的嵌套:关键代码:getChildFragmentManager()

3、标签页:ToolBar +SlidingTabLayout +ViewPager或PagerTabStrip+ViewPager,还有一个PagerTitleStrip,和PagerTabStrip差不多,只是没有下划线。


下面开始:

首先是侧滑

MainActivity的布局文件: activity_main.xml

最外层使用:

android.support.v4.widget.DrawerLayout
一开始显示在屏幕中间的用一个布局包裹起来,放在最上面

侧滑部分也用一个布局包裹起来,放在中间布局的下方

注意侧滑部分的布局要加上:

android:layout_gravity="left"
或者是“start”。

当然,如果你想要从右边侧滑的,只需将left改为right(或者是“end”)即可。

如果你左右侧滑都想加,记得添加顺序(1、中间内容部分 2、左边侧滑部分 3、右边侧滑部分)

说了这么多,可能没理解,来看一下 activity_maim.xml的完整代码吧:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:id="@+id/drawerLayout"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:background="#EEE"
  8. tools:context="com.graygrass.myfragmentnest.MainActivity">
  9. <!--屏幕正中的部分-->
  10. <LinearLayout
  11. android:layout_width="match_parent"
  12. android:layout_height="match_parent"
  13. android:orientation="vertical">
  14. <include layout="@layout/title" />
  15. <FrameLayout
  16. android:id="@+id/frameLayout"
  17. android:layout_width="match_parent"
  18. android:layout_height="match_parent" />
  19. </LinearLayout>
  20. <!--左边的侧滑-->
  21. <LinearLayout
  22. android:id="@+id/linearLayout_left"
  23. android:layout_width="match_parent"
  24. android:layout_height="match_parent"
  25. android:layout_gravity="left"
  26. android:background="@android:color/white"
  27. android:orientation="vertical">
  28. <Button
  29. android:id="@+id/btn_left1"
  30. android:layout_width="match_parent"
  31. android:layout_height="40dp"
  32. android:text="显示fragmentParent1" />
  33. <Button
  34. android:id="@+id/btn_left2"
  35. android:layout_width="match_parent"
  36. android:layout_height="40dp"
  37. android:text="显示fragmentParent2" />
  38. </LinearLayout>
  39. </android.support.v4.widget.DrawerLayout>

里面include的一个title的布局,只是标题栏的一张图片(为了让用户知道是有侧滑功能或者说方便点出侧滑菜单)和一段文字。

由于屏幕的中间放的是fragment,所以用FrameLayout来盛放。

到这里运行就可以拉出侧滑菜单了。


然后是MainActivity中:

实例化控件等等。。。

 DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);

给标题的图片加上点击事件,方便点出侧滑菜单:

drawerLayout.openDrawer(Gravity.LEFT);

关闭侧滑菜单:

drawerLayout.closeDrawer(Gravity.LEFT);

还有一个方法,用于切换fragment_parent :

  1. private void addFragmentToStack(Fragment fragment) {
  2. getSupportFragmentManager().beginTransaction().replace(R.id.frameLayout, fragment).commit();
  3. }

在左边的侧滑菜单的按钮中加上:

  1. @Override
  2. public void onClick(View v) {
  3. switch(v.getId()){
  4. case R.id.actionbar_img:
  5. drawerLayout.openDrawer(Gravity.LEFT);
  6. break;
  7. case R.id.btn_left1:
  8. drawerLayout.closeDrawer(Gravity.LEFT);
  9. addFragmentToStack(new FragmentParent1());
  10. break;
  11. case R.id.btn_left2:
  12. drawerLayout.closeDrawer(Gravity.LEFT);
  13. addFragmentToStack(new FragmentParent2());
  14. break;
  15. }
  16. }

其中的两个FragmentParent,   FragmentParent2没什么可讲的,里面只是有一行字而已。

FragmentParent1里面又包含了三个子Fragment,下面来看下布局:  fragment_parent1.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6. <include layout="@layout/toolbar_tab" />
  7. <android.support.v4.view.ViewPager
  8. android:id="@+id/viewPager"
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent" />
  11. </LinearLayout>

其中的toolbar_tab.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.v7.widget.Toolbar
  3. android:id="@+id/toolbar"
  4. xmlns:android="http://schemas.android.com/apk/res/android"
  5. android:layout_width="match_parent"
  6. android:layout_height="50dp"
  7. android:background="@color/colorPrimary">
  8. <com.graygrass.myfragmentnest.layout.SlidingTabLayout
  9. android:id="@+id/tabLayout"
  10. android:layout_width="match_parent"
  11. android:layout_height="match_parent" />
  12. </android.support.v7.widget.Toolbar>
使用SlidingTabLayout要添加两个类: SlidingTabLayoutSlidingTabStrip,可以去网上下载放进项目。

因为要用到ViewPager,所以需要写一个适配器Adapter:

与通常使用的Adapter不同的是,需要重写getPageTitle方法,将每个标签的标题放到SlidingTabLayout上。

  1. public class ViewPagerAdapter extends FragmentStatePagerAdapter {
  2. private List<Fragment> list;
  3. private Context context;
  4. private String[] titles={"fragment_child1_1","fragment_child1_2","fragment_child1_3"};
  5. public ViewPagerAdapter(FragmentManager fm, List<Fragment> list, Context context) {
  6. super(fm);
  7. this.list = list;
  8. this.context = context;
  9. }
  10. @Override
  11. public Fragment getItem(int position) {
  12. return list.get(position);
  13. }
  14. @Override
  15. public int getCount() {
  16. if(list!=null)
  17. return list.size();
  18. return 0;
  19. }
  20. @Override
  21. public CharSequence getPageTitle(int position) {
  22. return titles[position];
  23. }
  24. }

在FragmentParent1中,将Fragment_Child加入到List<Fragment> list 中:

注意此处FragmentManager须填写getChildFragmentManager(),因为是fragment的嵌套。

  1. list = new ArrayList<>();
  2. list.add(new FragmentChild1_1());
  3. list.add(new FragmentChild1_2());
  4. list.add(new FragmentChild1_3());
  5. ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager(), list, view.getContext());
  6. viewPager.setAdapter(adapter);
记得将ViewPager加入SlidingTabLayout里面:

tabLayout.setViewPager(viewPager);
还可以设置下划线的颜色:

  1. tabLayout.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() {
  2. @Override
  3. public int getIndicatorColor(int position) {
  4. return Color.WHITE;
  5. }
  6. });

也可以自定义tab上文字显示的样式:

tabLayout.setCustomTabView(R.layout.tab_text, 0);//注意这句一定要放在setViewPager前面
此处注意,由于我测试的标题文字都较长,故刚好可以占满屏幕,如果文字较短,则默认显示的会很短,即后面会有一段空白,如图:

此时可在自定义的文字样式 R.layout.tab_text中设android:layout_width="0dp"      android:layout_weight="1"使他们权重相等,各占相等的比重。


自定义背景颜色:

tabLayout.setBackgroundColor(getResources().getColor(R.color.title_green));

还有其他的可以去网上搜索。

至此,效果图一的效果就出来了。



效果图二与之的区别在 fragment_parent1.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">
  6. <android.support.v4.view.ViewPager
  7. android:id="@+id/viewPager"
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent">
  10. <android.support.v4.view.PagerTabStrip
  11. android:id="@+id/pagerTabStrip"
  12. android:layout_width="match_parent"
  13. android:layout_height="wrap_content"/>
  14. </android.support.v4.view.ViewPager>
  15. </LinearLayout>
apapter 同样要重写 getPageTitle方法,在FragmentParent1中viewPager.setAdapter(adapter)后的操作就不需要了。

至此,效果图二的效果就出来了。


源码下载:源码下载

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/279631
推荐阅读
相关标签
  

闽ICP备14008679号