关于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 ...
随机推荐
- Framework7 索引列表插件的异步加载实现
前言 Framework7 作为移动端的开发框架的优良之处已经无需多言.现在已经有了 React 和 Vue 版本,之前在项目中用过 F7 + vue 的开发方式,无论是效率还是产出都近乎完美.有时间 ...
- try.dot.net 的正确使用姿势
[简介] 微软官方前不久发布了 try.dot.net 这个有趣的网址,开始只是图个新鲜看了一下,后面通过自身实践过后,发现这着实算是个“有趣”的站点! 首先我们大概地列举一下这个站点能给我们带来什么 ...
- 轻量级ORM框架 Bankinate
[前言] 前面讲过ORM的前世今生,对ORM框架不了解的朋友可以参考博文:https://www.cnblogs.com/7tiny/p/9551754.html 今天,我们主要通过设计一款轻量级的O ...
- 【Swift 2.2】iOS开发笔记(三)
1.UITableView 中调用 UIButton 的 setTitle 会闪 滚动列表时比较明显,解决办法: buttonType 改成 custom 即可,但是这样一来 UIButton 的高亮 ...
- 家庭记账本小程序之框架设计(java web基础版一)
1.设计主页 main.jsp <%@ page language="java" contentType="text/html; charset=UTF-8&quo ...
- 控制结构(1): 分枝/叶子(branch/leaf)
// 下一篇:卫语句(guard clause) 典型代码: function doSomething1(){ // ... } function doSomething2(){ // ... } f ...
- Django标签和过滤器
过滤器格式{{ }} 标签格式{% %} 模板中过滤器filter只能使用一个参数,自定义标签中则可以使用多个参数!!! 过滤器能够采用链式的方式使用,例如:{{ text | escape | ...
- Java instanceof运算符
java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法: res ...
- Javaweb项目 利用JSP响应浏览器
一.javaweb 数据访问流程? 1.浏览器 http 访问服务器 找到 servlet(HttpServeltDemo.java文件) 2.servle 通过dao 访问数据库 数据库将数据返回 ...
- 【BZOJ5499】[2019省队联测]春节十二响(贪心)
[BZOJ5499][2019省队联测]春节十二响(贪心) 题面 BZOJ 洛谷 题解 如果是一条折链,显然维护两侧的值,每次两个堆分别弹出一个\(max\)然后合并一下,最后再放回去就可以了. 那么 ...