TabLayout+ViewPager

TabLayout联动ViewPager TabLayout和ViewPager究竟是怎样实现联动的?其实不难。看完这篇,你就会啦。 阅读详情

依赖:

implementation 'com.android.support:design:27.1.1'

xml布局

 <android.support.design.widget.TabLayout
        android:id="@+id/order_tab"
        android:layout_width="match_parent"
        android:layout_height="@dimen/dp_28"
        android:layout_below="@id/text1"
        app:tabIndicatorColor="@color/colorRed"
        app:tabMode="fixed"
        app:tabSelectedTextColor="@color/colorRed"
        app:tabTextColor="@color/colorBlack">

    </android.support.design.widget.TabLayout>


    <android.support.v4.view.ViewPager
        android:id="@+id/order_vpger"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/text">

    </android.support.v4.view.ViewPager>

添加数据:

  private void initData() {
        tab_sell = new ArrayList<>();
        tab_sell.add("全部");
        tab_sell.add("代付款");
        tab_sell.add("代发货");
        tab_sell.add("代收货");
        tab_sell.add("代评价");

        fragment_sell = new ArrayList<>();
        fragment_sell.add(new OrderAllFragment());
        fragment_sell.add(new OrderDfkFragment());
        fragment_sell.add(new OrderDfhFragment());
        fragment_sell.add(new OrderDshFragment());
        fragment_sell.add(new OrderDpjFragment());

    }

初始化,绑定适配器

 private void initViewPager() {
//        viewpager适配器
        mOrderVpger.setAdapter(new MyOrderPagerAdapter(getSupportFragmentManager(), fragment_sell, tab_sell));
//        绑定TabLayout
        mOrderTab.setupWithViewPager(mOrderVpger);

    }

viewpager适配器

public class MyOrderPagerAdapter extends FragmentPagerAdapter {
    private List<Fragment> fragment_sell;
    private List<String> tab_sell;


    public MyOrderPagerAdapter(FragmentManager fm, List<Fragment> fragment_sell, List<String> tab_sell) {
        super(fm);
        this.fragment_sell = fragment_sell;
        this.tab_sell=tab_sell;
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return tab_sell.get(position);
    }

    @Override
    public Fragment getItem(int position) {
        return fragment_sell.get(position);
    }

    @Override
    public int getCount() {
        return fragment_sell.size();
    }
}
//    自定义设置下划线长度
    @Override
    public void onStart() {
        super.onStart();
        mSyTab.post(new Runnable() {
            @Override
            public void run() {
                setIndicator(mSyTab, 25, 25);
            }
        });
    }
//    初始化下划线长度
    public void setIndicator(TabLayout tabs, int leftDip, int rightDip) {
        Class<?> tabLayout = tabs.getClass();
        Field tabStrip = null;
        try {
            tabStrip = tabLayout.getDeclaredField("mTabStrip");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }

        tabStrip.setAccessible(true);
        LinearLayout llTab = null;
        try {
            llTab = (LinearLayout) tabStrip.get(tabs);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        int left = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, leftDip, Resources.getSystem().getDisplayMetrics());
        int right = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, rightDip, Resources.getSystem().getDisplayMetrics());

        for (int i = 0; i < llTab.getChildCount(); i++) {
            View child = llTab.getChildAt(i);
            child.setPadding(0, 0, 0, 0);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1);
            params.leftMargin = left;
            params.rightMargin = right;
            child.setLayoutParams(params);
            child.invalidate();
        }


    }

设置tablayout下划线长度的方法

public void setIndicator(TabLayout tabs, int leftDip, int rightDip) {
    Class<?> tabLayout = tabs.getClass();
    Field tabStrip = null;
    try {
        tabStrip = tabLayout.getDeclaredField("mTabStrip");
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    }

    tabStrip.setAccessible(true);
    LinearLayout llTab = null;
    try {
        llTab = (LinearLayout) tabStrip.get(tabs);
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

    int left = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, leftDip, Resources.getSystem().getDisplayMetrics());
    int right = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, rightDip, Resources.getSystem().getDisplayMetrics());

    for (int i = 0; i < llTab.getChildCount(); i++) {
        View child = llTab.getChildAt(i);
        child.setPadding(0, 0, 0, 0);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1);
        params.leftMargin = left;
        params.rightMargin = right;
        child.setLayoutParams(params);
        child.invalidate();
    }


}

需要用的时候,,只要在有tablayout的地方就可以用了

使用的方法如下面的代码所示

这里面直接post了这个,并开了Runnable,然后设置当前的tablayout的对象,并设置长度就可以了

@Override
public void onStart() {
    super.onStart();
    tabLayout.post(new Runnable() {
        @Override
        public void run() {
            setIndicator(tabLayout, 50, 50);
        }
    });
}

ScrollView嵌套ViewPager+Fragment时冲突问题解决办法

1.ViewPager 中的Fragment 不显示
给xml中ScrollView设置android:fillViewport=”true” 属性。通过这个就可以让ViewPager中的内容显示。
顾名思义,这个属性允许 NestedScrollView中的组件去充满它。

<android.support.v4.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fillViewport="true">

            <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@color/com_bg_gray_eeeeee"

                android:descendantFocusability="blocksDescendants"
                android:orientation="vertical">

                <com.bigkoo.convenientbanner.ConvenientBanner
                    android:id="@+id/acty_main_cbanner"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/comm_dim_150" />

                <android.support.design.widget.TabLayout
                    android:id="@+id/acty_main_tab"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/comm_dim_40"
                    android:layout_alignParentBottom="true"
                    app:tabBackground="@drawable/selector_tab_bg"
                    app:tabIndicatorHeight="0dp"
                    app:tabSelectedTextColor="@color/com_tv_white_ffffff"
                    app:tabTextAppearance="@style/tab_txtSize"
                    app:tabTextColor="@color/com_tv_black_333333" />

                <android.support.v4.view.ViewPager
                    android:id="@+id/acty_main_vp"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />

            </LinearLayout>


        </android.support.v4.widget.NestedScrollView>

2.上下拖动ViewPager 不能垂直方向滚动

最开始使用的默认的ViewPager,发现不能上下滑动,然后通过查找别人的解决办法,NestedScrollView嵌套ViewPager后,如果viewPager中的fragment高度太长,会发现滑动不了,需要自定义ViewPager,测量ViewPager的高度.

public class WrapContentHeightViewPager extends ViewPager {
    public WrapContentHeightViewPager(Context context) {
        super(context);  
    }  

    public WrapContentHeightViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);  
    }  

    @Override  
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);  

        int height = 0;  
        for (int i = 0; i < getChildCount(); i++) {  
            View child = getChildAt(i);
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));  
            int h = child.getMeasuredHeight();  
            if (h > height) height = h;  
        }  
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);  
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);  
    }  
}  

然后将xml布局的ViewPager替换为我们自定义的ViewPager

<android.support.v4.widget.NestedScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fillViewport="true">

            <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@color/com_bg_gray_eeeeee"

                android:descendantFocusability="blocksDescendants"
                android:orientation="vertical">

                <com.bigkoo.convenientbanner.ConvenientBanner
                    android:id="@+id/acty_main_cbanner"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/comm_dim_150" />

                <android.support.design.widget.TabLayout
                    android:id="@+id/acty_main_tab"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/comm_dim_40"
                    android:layout_alignParentBottom="true"
                    app:tabBackground="@drawable/selector_tab_bg"
                    app:tabIndicatorHeight="0dp"
                    app:tabSelectedTextColor="@color/com_tv_white_ffffff"
                    app:tabTextAppearance="@style/tab_txtSize"
                    app:tabTextColor="@color/com_tv_black_333333" />

                <com.aoben.qproj.widget.WrapContentHeightViewPager
                    android:id="@+id/acty_main_vp"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content" />

            </LinearLayout>


        </android.support.v4.widget.NestedScrollView>
Android ViewPager2 & TabLayout TextView)?.also{ 阅读详情

相关推荐

TabLayout ViewPager 复用Fragment

一、主Activity public class MainActivity extends AppCompatActivity { TabLayout tabLayout; ViewPager viewPager; @Override protected void onCreate(Bundle savedInstanceState) { su

qq_29988575的博客 1702

TabLayout+ViewPager轻松搞定Tab栏切换

在项目开发中很多场景都会碰到tab栏切换的效果,实现的思路也有很多种,tabhost+fragment,radionbtton+viewpager等方式都可以实现,这里就说下tablayout+viewpager的实现方式;tablayout是android5.0推出来的一个MaterialDesign风格的控件,是专门用来实现tab栏效果的;功能强大,使用方便灵活;1、引入依赖库compile '

wangwo1991的博客 2万+

android之ViewPager与TabLayout

使用 TabLayout 很容易实现选项卡的功能。这里将结合 ViewPager、Fragment、TabLayout实现一个具有选项卡功能的程序。本例再上篇讲解的ViewPager与Fragment实例上修改,请结合上篇实例参考。 要实现这样一个程序,首先需要在布局文件中加入 TabLayout。MainActivity中对应的布局文件代码如下: ...

PPYY3344的博客 1143

TabLayout+ViewPager实现底部导航页

TabLayout是Android Support库中的一个控件,它通常与ViewPager结合使用,用于实现多个页面的切换和导航。TabLayout通过标签页的形式展示不同的内容,用户可以通过点击标签页来切换不同的页面。PagerAdapter是Android中的一个抽象类,用于在ViewPager中管理页面的适配器。它提供了统一的接口和方法,使得我们可以轻松地将不同的页面内容与ViewPager进行绑定并展示。PagerAdapter用于管理ViewPager中的页面,每个页面对应一个View。

A125679880的博客 3267

Sony微单相机alpha6000 wifi远程控制(1)

引言 Sony’s Camera Remote API beta SDK allows you to control a number of Sony cameras, including Sony Action cams, Sony Alpha cameras and Lens Style cameras, wirelessly from another device. 索尼于2017年三月Re...

markfuk996的博客 4965

02.1 知识图谱工具 Protege的下载安装与使用

Protege的下载安装与使用 本文是王昊奋老师《知识图谱》系列笔记第2.1篇。 文章目录Protege的下载安装与使用0 相关介绍0.0 Protege相关介绍0.1 Protégé的特点0.2 Protégé的用途1 Protege的下载1.1 准备工作:安装配置JAVA环境1.2 官网下载2 Protege的安装2.1 直接解压缩2.2 双击运行3 Protege的使用实例-创建类...

和而不流 7万+

Android ViewPager 与 TabLayout 联动实现

TabLayout 可以与 ViewPager 结合使用,以便在切换标签时自动切换 ViewPager 的子视图,实现标签导航和内容分页展示的功能。

简单记录工作和学习 2563

共模电感在EMI滤波中的实战应用与设计技巧

本文深入探讨了共模电感在EMI滤波中的关键作用与设计技巧,涵盖电感值选择、饱和电流风险、磁芯材料性能及绕组工艺等实战经验。通过具体案例解析,展示了共模电感在开关电源、高速接口及汽车电子中的高效应用,帮助工程师解决电磁兼容问题并提升信号完整性。

weixin_27051161的博客 417

安卓ViewPager的使用+TabLayout属性

安卓ViewPager的使用

似霰的博客 2767

05-SA8155 QNX Display框架及代码分析(1)

显示是非常重要的一个模块,人机交互的桥梁。那么SA8155 Hypervisor显示是如何处理的呢。对处理流程非常的好奇O(∩_∩)O哈哈~。TODO。

静虚待令,有物混成 1万+

OpenClaw实战:拒绝复制粘贴,用 xlsx 技能打通“带公式模板”的月报自动化

本文详解了如何利用 OpenClaw 框架搭载的 xlsx skill,解决 AI 自动化处理“带复杂公式与格式”Excel 月报时极易翻车的业务痛点。针对传统大模型粗暴写入导致模板报废的问题,OpenClaw 创新采用“双核微创”工作流:首先利用 pandas 高效清洗并聚合海量原始明细数据,随后切换至 openpyxl 将计算结果精准注入目标模板,完美保留原有的底色、边框与跨表动态公式。

我有一个梦想 151

TabLayout , ViewPager , Fragment

TabLayout 一. 页面切换指示器 , 使用前导入Android Design包:implementation'com.android.support:design:23.3.0' 二. 添加标签 //第一种方法: java代码中添加 TabLayout tabLayout = findViewById(R.id.tab); tabLayout.add...

Krehizi的博客 454

基于Simulink的自适应反步法(Adaptive Backstepping)控制​

本文针对非线性系统控制中未知参数和强非线性耦合的挑战,提出基于Simulink的自适应反步法解决方案。通过融合参数在线估计与反步递归设计,该方法显著提升了永磁同步电机(PMSM)速度控制的鲁棒性,使跟踪误差从20%降至3%,参数估计收敛时间小于0.5秒。文章详细阐述了从算法推导到Simulink实现的完整流程,包括系统架构设计、核心算法推导(以PMSM为例)、模块化建模方法、参数优化策略以及工程部署建议。提供的自适应控制器MATLAB代码和关键参数表可直接应用于实际工程,为电机驱动、机械臂等非线性系统控制提

xiaoheshang_123的博客 101

TabLayout和ViewPager

  这里就说下tablayout+viewpager的实现方式;tablayout是android5.0推出来的一个MaterialDesign风格的控件,是专门用来实现tab栏效果的;功能强大,使用方便灵活; 一、引入依赖库 使用非常方便,Android Studio只需要在gradle中引入即可使用 . apply plugin: 'com.android.applica...

weixin_30780221的博客 506

银河麒麟高级服务器V11操作系统安装部署zabbix监控平台的实操保姆级教程

本文详细介绍了在《银河麒麟高级服务器V11上安部署Zabbix监控系统的全过程》涵盖了zabbix监控系统涉及到的所有软件安装、参数优化、服务启动验证及防火墙配置等一系列实操。其中关于安装过程报错undefined symbol: usmAES256CiscoPrivProtocol;ares_reinit等依赖库问题进行了详细记录与分析解决;还提供了Web前端中文显示修复方案和Admin密码修改方法。实现监控平台的100%部署上线,实现对业务系统的实时监控,保证业务的稳定运行。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 531

YOLOv8改进策略【Neck】| CVPR 2024 MFM(Modulation Fusion Module,调制融合模块):动态特征加权融合,突出关键特征抑制冗余

本文主要利用DCMPNet中的 MFM 模块优化 YOLOv8 的目标检测网络模型。模块通过动态调制特征融合过程,实现了对多尺度、跨层级特征的智能聚合。将其应用于的改进过程中,针对目标检测中边界特征与语义信息的互补性需求,缓解网络中浅层细节与深层语义融合不足的问题。Depth Information Assisted Collaborative Mutual Promotion Network for Single Image Dehazing在图像去雾网络中,不同层级和类型的特征包含着互补的信息(如浅层的

Limiiiing的博客 351

Viewpager+tablayout

day007Viewpager+tablayout Viewpager+tablayout //布局文件 <com.google.android.material.tabs.TabLayout android:layout_width="match_parent" android:layout_height="wrap_content" app:tabMode="scrollable" app:tabIndicatorColor="@co

weixin_52360287的博客 408

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Tablayout与Viewpager的使用

学习Tablayout与Viewpager的使用 最终效果 引入一个支持包 位置在build.gradle activity代码如下 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns...

chen_xiaoke的博客 1253

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

TabLayout与ViewPager2配合使用

(代码不完整,但都是关键代码,备忘使用) ViewPager2 页面滚动状态改变回调处理,和TabLayout 联动 private val onPageChangeCallback = object: ViewPager2.OnPageChangeCallback(){ override fun onPageScrollStateChanged(state: Int) ...

baidu_33979074的博客 2607

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

tablayout_viewpager

MainActivity package com.example.a12_tablayout_viewpager; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentPagerAdapt

zj462136的博客 364

viewpager2与TabLayout联动

步骤: 1.引入依赖 dependencies { // For the latest version number of ViewPager2, please refer to the official page. // Link: https://developer.android.com/jetpack/androidx/releases/viewpager2 implementation 'androidx.viewpager2:viewpager2:1.0.0-alp

weixin_44898389的博客 1143

ViewPager,Fragment,TabLayout结合使用

效果图 为了实现如上效果,使用ViewPager,Fragment,TabLayout。 1.ViewPager直接继承了ViewGroup类,是一个容器,需要在里面添加我们想要显示的内容,类似于ListView,ViewPager类需要PagerAdaoter适配器类提供数据。ViewPager左右切换当前的view,实现滑动切换的效果。 2.Tablayout继承自HorizontalScrollView,用作页面切换指示器。 3.ViewPager,Fragment,TabLayout结合使用,实现

xuan的博客 2028

Tablayout+Viewpager的实现

我们通常会使用Tablayout+Viewpager来实现非常华丽的效果,既可以滑动也可以点击进行不同的界面跳转

Dianliang的博客 1061

tabLayout结合viewPager使用时tabLayout不显示

tabLayout结合viewPager使用时tabLayout不显示问题解决方案 一般tabLayout结合viewPager使用的代码都是这样写的 public class MainActivity extends AppCompatActivity { private static final String TAG ="MainActivity" ; List&lt;MyFr...

qq_40909351的博客 898
上一篇: 虚线.Alert.只有底部有边框.清空图片资源
下一篇: 垂直纵向的VerticalTabLayout+VerticalPager+fragment
user_app
博客等级 码龄9年 7粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值