关于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 ...
随机推荐
- 在物理内存中观察CLR托管内存及GC行为
虽然看了一些书,还网络上的一些博文,不过对CLR托管内存细节依然比较模糊.而且因为工作原因总会有很多质疑,想要亲眼看到内存里二进制数据的变化. 所以借助winhex直接查看内存以证实书上的描述或更进一 ...
- ES6相关
1.变量声明 let 和const 传统的 var 关键字声明变量,会存在变量提升.在ES6中,我们用 let 和 const 声明,let 声明变量,const 声明常量,let 和 const 都 ...
- vue脚手架搭建项目引用百度地图--出坑
这是官网地址 https://dafrok.github.io/vue-baidu-map/#/zh/start/installation 需要声明注意的是 BaiduMap 组件容器本身是一个空的块 ...
- 关于oracle sql语句查询时表名和字段名要加双引号的问题详解
转自:http://www.2cto.com/database/201504/387184.html 作为oracle的初学者相信大家一定会遇到这个问题,如图: 明明就是navicat可视化创建了表, ...
- Android插件化 学习
原文:http://weishu.me/2016/01/28/understand-plugin-framework-overview/ 代码:https://github.com/tiann/und ...
- 设置 sql_mode
MySQL 的 sql_mode 合理设置 sql_mode 是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入.在生产环境必须将这个值设置为严格模 ...
- Sequence II HDU - 5919(主席树)
Mr. Frog has an integer sequence of length n, which can be denoted as a1,a2,⋯,ana1,a2,⋯,anThere are ...
- 重建docker实例
1.显示当前运行的docker实例: [root@docker-test /]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORT ...
- EOJ 306 树上问题
题解: 因为w大于1,所以,题意就是,有多少(x,z),存在x到z的路径上,有一个x<y<z的y w没用的其实. 树上路径问题,有什么方法吗? 1.树链剖分.这个主要方便处理修改操作. 2 ...
- (转)史上最全 40 道 Dubbo 面试题及答案,看完碾压面试官!
背景:因为自己的简历写了dubbo,面试时候经常被问到.实际自己对dubbo的认识只停留在使用阶段,所以有必要好好补充下基础的理论知识. https://zhuanlan.zhihu.com/p/45 ...