关于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 ...
随机推荐
- 领域驱动设计系列文章(2)——浅析VO、DTO、DO、PO的概念、区别和用处
本篇文章主要讨论一下我们经常会用到的一些对象:VO.DTO.DO和PO. 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: ...
- mongoDB操作详细
简介 它和我们使用的关系型数据库最大的区别就是约束性,可以说文件型数据库几乎不存在约束性,理论上没有主外键约束,没有存储的数据类型约束等等 关系型数据库中有一个 "表" 的概念,有 ...
- virtualbox 设置centos7 双网卡上网
上次用virtualbox安装centos6.6,这次装了一个centos7.0.用两个版本的配置还是大同小异的. 1.修改/etc/sysconfig/network-scripts/ifcfg-e ...
- 关于token登录逻辑分析
前言: token登录上一家公司也写过,迷迷糊糊的, 现在做一个APP,需求为每次调用接口都会传token,登录注册等特殊的除外, 逻辑整理一下还是比较简单的 主要的问题还是,如何在框架中找到较好的插 ...
- DAY15、模块
一.函数的补充 1.函数回调: 提前在另一个函数中写出函数的调用,再根据实际的需求去考虑函数体的实现 def download(fn=None): print('开始下载') my_sleep(1) ...
- LODOP批量打印多页模版进行维护
批量打印的时候,可以循环多任务,也可以循环多页,很多的时候也可以分页分任务,分组打印.如果是一个任务里的多页相同的模版,一个任务中会有很多打印项,这些打印项在每页中的位置是相同的,如果要调整,调整结果 ...
- Python学习之路——函数的参数分类
今日内容 '''实参:调用函数,在括号内传入的实际值,值可以为常量.变量.表达式或三者的组合*****形参:定义函数,在括号内声明的变量名,用来接受外界传来的值''''''注:形参随着函数的调用 ...
- vue 点击当前元素添加class 去掉兄弟的class 获取当前点击元素的文字
点击当前标签给其添加class,兄弟标签class删除 然后获取当前点击元素的文字 演示地址: https://xibushijie.github.io/static/addClass.html &l ...
- 初识服务器和Linux
一.什么是计算机 1.介绍 一说到计算机,我们首先想到的就是电脑,没错,电脑就是计算机,但是计算机不只是电脑. 所谓的电脑就是一种计算机,而计算机其实是:接收使用者输入的指令与资料,经中央处理器的数学 ...
- luogu P2071 座位安排
这个题可以被分为两部分 1.匈牙利算法(板子) 2.邻接表存图(好像这不能称为第二部分) 每一排能坐两个人,那就把一排拆成两个点, 用匈牙利算法求最大匹配 每个人都只想坐两排,说明每个人只会连四条边 ...