完美实现tab和Fragment的联动效果

从‘科目一测试’到商业应用:ViewPager+Fragment的5个高级玩法与避坑指南 本文深入探讨了Android开发中ViewPager与Fragment的高级应用,从基础架构优化到商业级解决方案。涵盖ViewPager2迁移、TabLayout集成、性能优化、滑动冲突处理等核心内容,帮助开发者解决复杂业务场景下的技术难题,提升应用性能和用户体验。 阅读详情

完美实现RadioGroup与Fragment的联动效果

关于RadioGroup的与Fragment的实现,在许多博客中都能看到,它的实现也很简单。我这里介绍的是如何保证Fragment的状态会被保存,而不会在加载时从新创建一个新的Fragment,其实细心的朋友可能已经发现了。在Fragment创建的时候,它要显示在当前的Activity上时,会执行它的attach方法,而在退出时会执行它的detach方法。我们都知道Fragment的管理都是借助FragmentManager来实现的,那么只要能在切换Fragment的时候我们使用attach切换到已经存在的Fragment,那么这个Fragment就不会被从新创建,当我们退出这个Fragment的时候就调用detach断开当前与Fragment的连接。废话不多说,直接上代码:

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:orientation="vertical"
        android:id="@+id/fragmentlayout"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <RadioGroup
        android:id="@+id/rg_tab"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="horizontal" >

        <RadioButton
            android:id="@+id/message_tab"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:button="@null"
            android:gravity="center"
            android:text="消息" />

        <RadioButton
            android:id="@+id/contact_tab"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:button="@null"
            android:gravity="center"
            android:text="联系人" />

        <RadioButton
            android:id="@+id/discover_tab"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:button="@null"
            android:gravity="center"
            android:text="发现" />
    </RadioGroup>

</LinearLayout>

MainActivity.java

<pre name="code" class="java">package com.example.tabdemo;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;

public class MainActivity extends FragmentActivity {
	
	RadioGroup radioGroup;
	//现在要显示的Fargment
	Fragment fragment;
	//用于记录上一个Fragment
	Fragment preFragment;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//初始化View
		initView();
	}
	private void initView() {
		radioGroup=(RadioGroup) findViewById(R.id.rg_tab);
		//添加选择事件
		radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
			
			@Override
			public void onCheckedChanged(RadioGroup group, int checkedId) {
				//替换对应的Fragment
				changeFragment(checkedId);
			}
		});
		//初始化显示的fragment数据,判断是否为空,为空加载,不为空直接显示
		FragmentTransaction transaction = getSupportFragmentManager()
				.beginTransaction();
		fragment = getSupportFragmentManager().findFragmentByTag("message");
		if (fragment == null) {
			fragment=getFragment(R.id.message_tab);
			preFragment=fragment;
			transaction.add(R.id.fragmentlayout, fragment);
		} else {
			transaction.attach(fragment);
		}
		preFragment=fragment;
		transaction.commit();
	}
	/**
	 * 根据Id获取对应的Fragment
	 * @param checkedId
	 */
	private void changeFragment(int checkedId) {
		//获取与Fragment对应的Tag
		String tag = getTag(checkedId);
		FragmentTransaction ft=getSupportFragmentManager().beginTransaction();
		if(preFragment!=null){
			ft.detach(preFragment);
		}
		//通过Tag获取与之对应的Fragment
		fragment=getSupportFragmentManager().findFragmentByTag(tag);
		if (fragment == null) {
			fragment=getFragment(checkedId);
			ft.add(R.id.fragmentlayout, fragment, tag);
		} else {
			ft.attach(fragment);
		}
		ft.commit();
		preFragment=fragment;
	}
	/**
	 * 通过id获取与之对应的Tag
	 * @param id
	 * @return
	 */
	private String getTag(int id) {
		String tag = null;
		switch (id) {
		case R.id.message_tab:
			tag = "message";
			break;
		case R.id.contact_tab:
			tag = "contact";
			break;
		case R.id.discover_tab:
			tag = "discover";
			break;
		}
		return tag;
	}
	/**
	 * 通过id获得对应的Fragment
	 * @param checkId
	 * @return
	 */
	private Fragment getFragment(int checkId){
		Fragment fragment=null;
		switch (checkId) {
		case R.id.message_tab:
			fragment=new MessageFrament();
			break;
		case R.id.contact_tab:
			fragment=new ContactFrament();
			break;
		case R.id.discover_tab:
			fragment=new DiscoverFrament();
			break;
		}
		return fragment;
	}
}


Fragment.java

public class MessageFrament extends Fragment {

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.fragment_message, null);
	}
}

fragment_message.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
	<TextView 
	    android:layout_width="match_parent"
	    android:layout_height="match_parent"
	    android:text="消息模块"/>
</LinearLayout>

其他两个Fragment与这个Fragment的代码相同,所以就不另外给出了。下面附上效果图:




Android TabLayout+ViewPager黄金组合实战指南 TabLayout和ViewPager是Android原生分页导航的核心组件,基于PagerAdapter实现Fragment页面容器与顶部标签栏的双向协同。其原理在于TabLayout负责UI渲染与用户交互,ViewPager承担页面调度与生命周期管理,二者通过setupWithViewPager建立松耦合绑定。该方案具备零第三方依赖、全版本兼容、调试友好等技术价值,广泛应用于电商详情页、教育App模块切换、政务平台多栏目等场景。相比ViewPager2需自行实现Tab逻辑,或BottomNavigati 阅读详情

相关推荐

Android Tab(TabLayout+Fragment)实现源码

Android Tab(TabLayout+Fragment)实现源码

tab+Fragment管理最佳实践

现在的app视图中tab+fragment是最常用的一种布局,但是如果使用才是更简洁更有效的呢?下面通过一个demo的分类测试来分析下:add remove replace detach attach hide show这些方法的使用对Fragment生命周期的影响分析: 顺便分析下Fragment所依赖的Activity的生命周期;测试代码如下: MainActivity的代码如下:packa

u013168615的专栏 5288

tab+fragment实现主页

使用tabhost和fragment实现主页显示界面

配置化方式简化实现Tab+Fragment首页模式

目前最常见的app首页样式就是底部tab+多个Fragment这样的方式了,写法也有很多,基本都是在布局里写好布局,然后Activity中做点击的处理,切换样式啦、切换页面啦、记录事件啦等等。为了简化这一操作,稍微写了个控件封装了一小波,使用配置文件的方式处理这种模式。 使用方式 very easy,首先布局中添加该布局,并使用container_id指定Fragment的容器布局 &...

lizebin_bin的博客 465

Tab+Viewpage+Fragment实现导航.rar

源码参考,欢迎下载

Eureka自我保护机制

Eureka自我保护机制 默认情况下,当eureka server在一定时间内没有收到实例的心跳,便会把该实例从注册表中删除(默认是90秒),但是,如果短时间内丢失大量的实例心跳,便会触发eureka server的自我保护机制,比如在开发测试时,需要频繁地重启微服务实例,但是我们很少会把eureka server一起重启(因为在开发过程中不会修改eureka注册中心),当一分钟内收到的心跳数大量减少时,会触发该保护机制。可以在eureka管理界面看到Renews threshold和Renews(last

Soul_Ming的博客 542

底部Tab页与Fragment结合用法

之前就一直想写有关于这方面的东西,因为这些还是算比较基础的知识,对于这些一定得掌握好,才有利于以后的发展。 那么下面就进入今天的正题吧。 首先来看看效果图吧: 实现这样一种效果,其实很简单: 1、底部tab页 的实现方法,其实这里有很多种方法,比如说RadioButton之类的,我这里就直接用的ImageView和TextView 2、如何将Fragment和底部的Tab页关联起

枫 615

从0开始部署基础的AlwaysOn

在这个快餐文化盛行的时代,应该没多少人真的会沉下心来看理论和具体步骤,加上我自己也需要一篇可以扩展的快速搭建环境的指引,所以特别写了这篇文章。 我们在这里要做的事情有以下几个:安装环境。包括虚拟机和网络配置等。安装Windows域、配置必要的账号密码及功能。搭建域环境并进行配置。安装配置Windows Server Failover Cluster(WSFC)。安装SQL Server。配置Alw

MVP黄钊吉(發糞塗牆) 7567

Google Nano Banana 2 Lite:4秒生成图像的成本优化方案

文生图技术作为生成式AI的核心应用,通过深度学习模型将文本描述转换为视觉内容。其原理基于扩散模型和注意力机制,在保持语义一致性的同时生成高质量图像。在工程实践中,开发者常面临速度、成本与质量的权衡挑战。Google Nano Banana 2 Lite通过模型剪枝和量化技术优化,实现每千张图像0.034美元的极低成本,特别适合电商内容生成和实时交互场景。该模型在提示词遵循和批量处理方面表现稳定,为高吞吐量应用提供了可行的技术方案。

weixin_30247307的博客 464

Dify 进阶指南 | 5步打造智能JSON转换器(Excel数据预处理神器)

本文详细介绍了如何利用Dify平台的Chatflow功能,通过5个步骤构建一个智能JSON转换器,专门用于Excel数据预处理。该工具能够根据用户指令自动解析Excel表格,执行数据清洗、聚合计算,并精准输出定制化的JSON格式,极大提升前端开发、数据分析与测试工作的效率。

weixin_28520495的博客 574

Cadence安装

选择刚刚解压的E盘DVD驱动中的setup.exe文件,安装路径推荐D盘,此处会自己给你新建文件夹,我们无需手动建文件夹。但是,新产品有一些BUG(影响使用流畅性),所以我们要对17.4打补丁,补丁包同样去吴川斌的博客下载。下载阿狸狗破戒大师 我这边下载的是版本V3.2.6,同样在吴川斌的博客下载安装包,链接同上。记录一下安装过程,方便以后安装使用Cadence。破解完成后,建议将这两个软件创建快捷方式到桌面。到这里,我们已经可以正常的使用Cadence了。对光盘映像文件解压后双击,可以在我的电脑看到。

电子那些事儿 1万+

Day12 设置tab+Fragment+Viewpager

list.add(new CustomTableEntity("首页",R.drawable.home,R.drawable.unhome));list.add(new CustomTableEntity("我的",R.drawable.home,R.drawable.unhome));list.add(new CustomTableEntity("推荐",R.drawable.home,R.drawable.unhome));加入fragment。fragment适配器。设置联动和显示消息数。

2301_76628566的博客 172

告别玄学:手把手配置EtherCAT从站PDI接口与同步采样(含Sync/Latch信号实战)

本文详细解析了EtherCAT从站PDI接口配置与同步采样技术,涵盖微处理器通信与直接驱动IO模式选择、同步采样四大触发模式(SOF、Latch_in、Sync0/Sync1)及输出触发实战。通过伺服驱动器实例,帮助工程师突破配置难点,实现高精度同步控制,提升工业自动化系统性能。

weixin_30667649的博客 483

Android ViewPager与ViewPageIndicator实现Tab导航详解

在Android开发中,Fragment与ViewPager的组合是实现分页导航的核心技术方案。ViewPager通过预加载机制优化页面切换性能,配合FragmentPagerAdapter实现动态内容加载。这种架构特别适合新闻类App的顶部Tab导航场景,既能保证流畅的手势滑动体验,又能灵活定制指示器样式。ViewPageIndicator作为经典扩展库,提供了标题高亮、下划线动画等丰富的交互效果,其原理是通过重写onDraw方法实现自定义绘制。对于需要复杂动效的项目,可以基于ViewPager2生态进行

weixin_34372728的博客 448

Materials Studio实战技巧(八)——利用片段库高效构建有机金属配合物

本文详细介绍了在Materials Studio中利用Fragment Browser(片段浏览器)高效构建有机金属配合物的实战技巧。通过调用预置的Metal Templates和Ligands库,用户可以快速搭建如茂金属催化剂等复杂分子骨架,并利用对称性操作精确控制Meso与Rac构型。文章还涵盖了自定义片段库的创建与使用,能显著提升建模效率,适用于计算化学与材料模拟领域的研究者。

wine的专栏 936

矩阵LED和矩阵按键

先说矩阵LED,如图: 下面以行几、列几的表达方法说明 三极管可以当做开关使用 由图可知,如果想让一个LED亮,那么它对应的行和列的三极管都要导通。如果这个矩阵每次只亮一个LED,那么正常写程序没问题。 如果我们想让LED1和LED6亮,其他灯不亮,则需要开启行1、行2、列1、列2,随之带来的问题就是LED2和LED5也会跟着亮起来。 解决方法类似于扫描,因为单片机运行速度很快,可以在很短的时间内开关数次而肉眼看不到。所以我们可以每次只亮一列(排)灯,亮单位时间后关掉同时开启另外一列(排),如此四次一循环

qq_46615634的博客 5789

如何快速集成FlowHelper?3分钟实现与ViewPager无缝搭配的Tab布局

FlowHelper是一款高效的Android开发工具,能够帮助开发者迅速构建顶部Tab布局,轻松实现类似今日头条的热搜标签、搜索记录展示,以及与ViewPager/ViewPager2无缝搭配的滑动切换效果。无论是新手还是有经验的开发者,都能通过简单几步快速集成,提升App的UI交互体验。 ## 🌟 FlowHelper核心优势与应用场景 FlowHelper作为专注于Tab布局的工具类,

gitblog_00586的博客 256

Claude Code Agents 进阶:多代理协作与任务委托

Agent 是一个独立运行的 Claude 实例,它有自己的上下文和任务焦点。│ 主 Claude ││ (协调者) ││ │ │▼ ▼ ▼│ 代码审查 │ │ 测试生成 │ │ 文档编写 ││ │ ││▼汇总结果,完成任务并行处理:多个 Agent 同时工作,提高效率任务隔离:每个 Agent 有独立的上下文专业分工:不同类型的 Agent 擅长不同任务灵活控制:可以指定运行模式、超时等参数。

gaoxiang_120的专栏 336

AndroidNavigation与ViewPager2集成:实现复杂导航场景的最佳实践

AndroidNavigation是一个强大的Android导航库,专注于管理导航、嵌套Fragment、状态栏和工具栏。本指南将详细介绍如何将AndroidNavigation与ViewPager2无缝集成,帮助开发者轻松构建现代化的复杂导航场景,提升用户体验和开发效率。 ## 📌 核心概念:为什么选择AndroidNavigation+ViewPager2组合 在现代Android应用开

gitblog_00813的博客 884

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

viewpager+fragment之fragment懒加载

今天讲 advancedpagerslidingtabstrip取消预加载 首先我使用的viewpager+fragment还有viewpaget的指示器,三者结合着去做的 实现懒加载 这里面viewpager指示器我用的第三方的框架 AdvancedPagerSlidingTabStrip AdvancedPagerSlidingTabStrip是一种Android平台的导航控件,完美兼容Androi

Mr小颜同学的博客 2360

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Storybook Play Function 实战指南:在 Story 中自动填充表单、模拟交互并验证组件行为

`play` 函数是 Storybook 在 Story 渲染完成后自动执行的脚本片段,它让开发者无需人工干预即可驱动组件交互,覆盖「需要真实用户操作才能触发」的场景——例如填写注册表单、点击提交按钮、打开弹窗等。本文基于当前仓库中 [docs/_snippets/play-function.md](https://gitcode.com/GitHub_Trending/st/storybook/

gitblog_00002的博客 830

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

RuoYi Android App 首页导航定制化方案全解析

RuoYi Android App 是基于Kotlin开发的移动端解决方案,完美对接 RuoYi-Go、RuoYi-Vue、RuoYi-Cloud 三大后端版本!目前已落地登录、个人中心、工作台、资料编辑、头像 / 密码修改、常见问题、关于我们等核心功能,为企业级移动端开发提供开箱即用的基础能力。RuoYi_Android_App 的首页导航方案兼顾「易用性」和「扩展性」:基础层:通过 LinearLayout+ViewPager+RecyclerView 构建稳定的布局结构;

一个持续编程的盲人。 666

PagerSlidingTabStrip介绍及使用,让ViewPager更绚丽

PagerSlidingTabStrip介绍及使用,让ViewPager更绚丽

sinat_28238111的博客 629

FlycoTabLayout与ViewPager2完美适配方案:从冲突解决到流畅体验

你是否还在为Android项目中的TabLayout与ViewPager2联动卡顿而烦恼?是否遇到过滑动时指示器错位、Tab选择状态不同步的问题?本文将系统讲解如何解决FlycoTabLayout与ViewPager2的兼容性问题,通过5个实战步骤+3种高级定制方案,让你的标签页交互达到商业级应用流畅度。 读完本文你将获得: - 掌握ViewPager2与FlycoTabLayout双向绑定的核...

gitblog_00500的博客 966

Loro 二进制编码的 Moonbit 互操作目标与验收标准:从 Rust 真值到跨语言 Lossless IR 的落地路线

本篇技术指南围绕 `moon/specs/00-goals-and-acceptance.md` 展开,系统梳理 Loro 项目为在 Moonbit 中实现与 Rust 版 Loro 完全互操作的二进制编解码而设定的目标、范围与验收标准。你将掌握 FastSnapshot(mode=3)与 FastUpdates(mode=4)两种编码模式的互操作边界、Lossless IR 的阶段性落地策略,以

gitblog_00749的博客 1042
上一篇: Activity与Service的交互二
下一篇: 仿微信Tab颜色渐变自定义View
ForgetFormerly
博客等级 码龄12年 9粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值