关于TabLayout与ViewPager在Fragment中嵌套Fragment使用或配合使用的思考
注意:
因为继承的是Fragment,所以getSupportFragmentManager()与getFragmentManager()方法无法使用,这里需要用到getChildFragmentManager()方法;
(用getFragmentManager()方法并不会报错,但到时候运行的时候会出问题,查了好久才知道这个错误)
统一Fragment类型,要么为“android.support.v4.app.Fragment”,要么为“android.app.Fragment”;
明白需求类型,正确使用adpter:FragmentPagerAdapter、PagerAdapter等等;Fragment中嵌套Fragment可以使用FragmentPagerAdapter。
先是TabLayout:
贴出xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="com.xxx.xxx.xxx.xxxFragment"
android:orientation="vertical"> <android.support.design.widget.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="50dp"
app:tabSelectedTextColor="#000"
app:tabTextColor="#939292"
app:tabTextAppearance="@style/TabLayoutTextStyle"
app:tabIndicatorColor="#000"
app:tabBackground="@null"
app:tabIndicatorHeight="1dp"
app:tabGravity="fill"/>
<View
android:layout_width="match_parent"
android:layout_height="3dp"
android:layout_below="@+id/tabLayout"
android:background="@drawable/toolbar">
</View>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
View起装饰作用,若不使用ViewPager则可去掉xml中的ViewPager定义。
再是对TabLayout属性的一些介绍及与ViewPager配合使用的一些思考:
1.改变选中字体的颜色
app:tabSelectedTextColor="xxx"
2.改变未选中字体的颜色
app:tabTextColor="xxx"
3.改变指示器下标的颜色
app:tabIndicatorColor="xxx"
4.改变整个TabLayout的颜色
app:tabBackground="xxx"
5.设置指示器下标的高度:
app:tabIndicatorHeight="xxdp"
6.设置Tab内部的子控件的Padding:
app:tabPadding="xxdp"
app:tabPaddingTop="xxdp"
app:tabPaddingStart="xxdp"
app:tabPaddingEnd="xxdp"
app:tabPaddingBottom="xxdp"
7.设置整个TabLayout的Padding:
app:paddingEnd="xxdp"
app:paddingStart="xxdp"
8.内容的显示模式
app:tabGravity="center"//居中,如果是fill,则是充满
9.设置最大的tab宽度:
app:tabMaxWidth="xxdp"
10.设置最小的tab宽度:
app:tabMinWidth="xxdp"
11.TabLayout开始位置的偏移量:
app:tabContentStart="100dp"
有时候在xml中设置TabLayout的属性可能不会起作用(遇到过但还不清楚为什么),这时候就需要在逻辑中对TabLayout属性进行设置,如:
tabLayout.setSelectedTabIndicatorColor(Color.BLACK);//设置下标颜色
tabLayout.setSelectedTabIndicatorHeight(1);//设置下标高度
使用的TabLayout可以没有文字,在设置中如:
tabLayout.addTab(tabLayout.newTab().setIcon(R.drawable.xxx));
若不配合ViewPager使用可以用以下方法进行监听联动其他Fragment:
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener(){
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
@Override
public void onTabSelected(TabLayout.Tab tab) {
Log.e("TAG","tab position:"+tab.getPosition());
FragmentManager fm = xxxFragment.this.getChildFragmentManager();
//开启事务
FragmentTransaction transaction = fm.beginTransaction();
Intent intent;
switch (tab.getPosition()){
case 0:{
if (mxxxFragment == null) {
mxxxFragment = new xxxFragment();
Bundle bundle = new Bundle();
bundle.putInt("xx", xx);
mxxxFragment.setArguments(bundle);
}
transaction = fm.beginTransaction();
transaction.replace(R.id.xxx, mxxxFragment); //连接TabLayout下的Fragment需要放置的位置
transaction.commit();
break;
}
case 1:{
intent = new Intent(getActivity(), xxxActivity.class);
startActivity(intent);
break;
default:
break;
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
或启一个list放置动态建立fragment(在onCreateView方法中完成,可配合ViewPager中Adapter的定义):
List<Fragment> fragments=new ArrayList<Fragment>();
fragments.add(new xxxFragment());
fragments.add(new xxxFragment());
若想配合ViewPager使用:
private TabLayout mTabLayout;
private ViewPager mViewPager;
FragmentPagerAdapter mAdapter;
//对TabLayout以及ViewPager的监听,以下皆在onCreateView方法中完成
mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
mTabLayout = (TabLayout) view.findViewById(R.id.tabLayout);
FragmentManager man = AboutFragment.this.getChildFragmentManager();
mTabLayout.setTabMode(TabLayout.MODE_FIXED);//设置tab模式,当前为系统默认模式
mAdapter= new FragmentAdapter(man,fragments);
mViewPager.setAdapter(mAdapter);//给ViewPager设置适配器
mTabLayout.setupWithViewPager(mViewPager);//将TabLayout和ViewPager关联起来。
mTabLayout.setTabsFromPagerAdapter(mAdapter);//给Tabs设置适配器
再是对adpter的定义:
public class FragmentAdapter extends FragmentPagerAdapter {
private String [] title = {"已关注","你"};
private List<Fragment> fragmentList;
public FragmentAdapter(FragmentManager fm, List<Fragment> fragmentList) {
super(fm);
this.fragmentList = fragmentList;
}
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);//或返回具体的fragment并传值
}
@Override
public int getCount() {
return fragmentList.size();
}
@Override
public CharSequence getPageTitle(int position) {
return title[position];
}
}
若遇到报错,请检查关于fragment的import是否统一,如:
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
值得注意的是:
如果需要进行fragment间数据的传递(如联网时传递用户数据),则需在每个fragment中加入如:
public static xxxFragment newInstance(String param1) {
xxxFragment fragment = new xxxFragment();
Bundle args = new Bundle();
args.putString("agrs1", param1);
fragment.setArguments(args);
return fragment;
}
最终效果有如:

关于TabLayout与ViewPager在Fragment中嵌套Fragment使用或配合使用的思考的更多相关文章
- fragment中嵌套viewpager,vierpager中有多个fragment,不显示 .
fragment中嵌套viewpager,vierpager中有多个fragment,不显示 ... 现在好多应用流行一种布局.底部几个工具栏选项,上面也有类似tab的选项. 底部用RadioGrou ...
- Fragment里面嵌套Fragment的问题
最近两天做项目时,要在fragment里面嵌套Fragment,最开始使用Fragment的hide,show等方法一直失败,,如图,message是一个fragment,在里面又有两个子fragme ...
- [Android Pro] fragment中嵌套viewpager,vierpager中有多个fragment,不显示
referece to : http://blog.csdn.net/mybook1122/article/details/24003343 现在好多应用流行一种布局.底部几个工具栏选项,上面也有类 ...
- 关于Fragment里面嵌套fragment
今天看到一篇好文章 https://www.2cto.com/kf/201609/545979.html 转载过来记录一下,往后需要的时候可以随时查看: 接下来进入正题: 动态fragment的使用 ...
- Android 中关于Fragment嵌套Fragment的问题
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5802146.html 问题描述: 在项目中Activity A中嵌套Fragment B,Fragment ...
- Android开发之利用ViewPager实现在Activity或Fragment中引入别的布局文件实现滑动并进行页面跳转
有些时候经常可以看到其他APP中有一排的图标,可以在一个界面中滑来滑去,并且图标可以进行点击事件进行页面的跳转.这里对这种方法的实现做出总结. 首先看一下图片: 下面这两种图片是在一个Fragment ...
- 如何进行fragment中的来回切换?
本文选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章将为读者分享国外最优质的精彩问与答,供读者学习和了解国外最新技术,本文为大家讲解如何进行fragment中的来回切 ...
- Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理
Toolbar作为ActionBar使用介绍 本文介绍了在Android中将Toolbar作为ActionBar使用的方法. 并且介绍了在Fragment和嵌套Fragment中使用Toolbar作为 ...
- Android Toolbar使用及Fragment中的Toolbar处理
Toolbar作为ActionBar使用介绍 本文介绍了在Android中将Toolbar作为ActionBar使用的方法.并且介绍了在Fragment和嵌套Fragment中使用Toolbar作为A ...
随机推荐
- Linux下redis的安装及配置
1.去官网下载redis(redis.io) 2.将其解压到根目录下 3.进入解压的目录,然后编译源程序, 如果不是root账户登录的,命令前面需要加sudo make make install PR ...
- JS--编码规范
1. 请修复给定的 js 代码中,函数定义存在的问题 function functions(flag) { if (flag) { function getValue() { return 'a'; ...
- JS-数组操作3
1. 找出数组 arr 中重复出现过的元素 function duplicates(arr) { var result = []; var count = []; for (var i=0;i< ...
- P1836 【数页码_NOI导刊2011提高(04)】
P1836 数页码_NOI导刊2011提高(04) 题目描述 一本书的页码是从1—n编号的连续整数:1,2,3,…,n.请你求出全部页码中所有单个数字的和,例如第123页,它的和就是1+2+3=6. ...
- 进程间通信(队列、管道)、消费者模型和进程池(apply,apply_async,map)
一.队列(先进先出) 进程间通信:IPC(Inter-Process Communication) 队列是使用管道和锁定实现,所以Queue是多进程安全的队列,使用Queue可以实现多进程之间的数据传 ...
- ORM之自关联、add、set方法、聚合函数、F、Q查询和事务
一.外键自关联(一对多) 1.建表 # 评论表 class Comment(models.Model): id = models.AutoField(primary_key=True) content ...
- 简单了解uuid
1.含义 UUID-Universally Unique IDentifiers,翻译过来就是“全局唯一标志符”. UUID到底是什么? UUID是一个标帜你系统中的存储设备的字符串,其目的是帮助使用 ...
- JS自定义表单提交处理方案
JS自定义数据提交处理方案 问题 在Ajax技术流行的今天,我遇到了一个很头疼的问题,我需要维护一个前人开发的问题单模块功能,并且不停的迭代开发,而这个问题就是问题单字段特别多,而且除了更新问题单外, ...
- 【XSY3139】预言家 数位DP NFA
题目描述 有一个定义在 \(\{0,1,2,3,4,5,6,7,8,9\}\) 上的合规表达式,包含三种基本的操作: 结合:\(E_1E_2\) 分配:\((E_1|E_2|\ldots|E_n),n ...
- markdown笔记实现页内目录跳转
方法一 使用Markdown的语法来增加跳转链接:[名称](#id). 1. 只要()内 #号 后面的内容和锚点处标签内的id对应即可,可以任意使用标签支持html语法 2. id不可以有括号和空格, ...