使用Fragment实现底部菜单的切换

2023-11-07

在做android项目的时候,经常会遇到底部有几个菜单,点击之后,页面上面部分需要展示不同的内容,如下图:


在我的这个例子里面,采用了Fragment来展示点击下面菜单之后的不同数据。


开发步骤:

1)分析页面布局

     页面分成底部菜单和上面的展示区域。整体布局采用LinearLayout垂直布局,下面的菜单同样使用LinearLayout,水平线性布局。每一个小图标和下面的文字,我这里采用的是线性垂直布局,首页、热点、留言和我的,平分页面宽度。

     main.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">
    <FrameLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >
    </FrameLayout>
    <include layout="@layout/include_bottom"/>
</LinearLayout>

main.xml文件中包含了一个include_bottom.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="wrap_content"
    android:orientation="vertical">
    <View 
	    android:layout_width="match_parent"
	    android:layout_height="1dp"
	    android:background="@color/line_view"
        />
    <LinearLayout 
	    android:layout_width="match_parent"
	    android:layout_height="wrap_content"
	    android:orientation="horizontal"
	    android:background="@color/menu_bgcolor"
        >
        <!-- 首页 -->
        <LinearLayout 
            android:id="@+id/ll_menu_home"
		    android:layout_width="0dp"
		    android:layout_height="wrap_content"
		    android:layout_weight="1"
	    	android:orientation="vertical"
		    android:gravity="center"
		    android:padding="5dp"
		    android:onClick="clickMenu"
            >
            <ImageView
                android:id="@+id/iv_menu_home" 
			    android:layout_width="wrap_content"
			    android:layout_height="wrap_content"
                android:background="@drawable/menu_home"
                android:contentDescription="@string/app_name"/>
            <TextView 
                android:id="@+id/tv_menu_home"
			    android:layout_width="wrap_content"
			    android:layout_height="wrap_content"
                android:text="@string/menu_home"
                android:textColor="@color/menu_nomarl"
                android:textSize="12sp"
                />
        </LinearLayout>
        <!-- 热点 -->
        <LinearLayout 
            android:id="@+id/ll_menu_hot"
		    android:layout_width="0dp"
		    android:layout_height="wrap_content"
		    android:layout_weight="1"
		    android:gravity="center"
	    	android:orientation="vertical"
		    android:padding="5dp"
		    android:onClick="clickMenu"
            >
            <ImageView
                android:id="@+id/iv_menu_hot" 
			    android:layout_width="wrap_content"
			    android:layout_height="wrap_content"
                android:background="@drawable/menu_hot"
                android:contentDescription="@string/app_name"/>
            <TextView 
                android:id="@+id/tv_menu_hot"
			    android:layout_width="wrap_content"
			    android:layout_height="wrap_content"
                android:text="@string/menu_hot"
                android:textColor="@color/menu_nomarl"
                android:textSize="12sp"
                />
        </LinearLayout>
        <!-- 发言 -->
        <LinearLayout 
            android:id="@+id/ll_menu_talk"
		    android:layout_width="0dp"
		    android:layout_height="wrap_content"
		    android:layout_weight="1"
		    android:gravity="center"
	    	android:orientation="vertical"
		    android:padding="5dp"
		    android:onClick="clickMenu"
            >
            <ImageView
                android:id="@+id/iv_menu_talk" 
			    android:layout_width="wrap_content"
			    android:layout_height="wrap_content"
                android:background="@drawable/menu_talk"
                android:contentDescription="@string/app_name"/>
            <TextView 
                android:id="@+id/tv_menu_talk"
			    android:layout_width="wrap_content"
			    android:layout_height="wrap_content"
                android:text="@string/menu_talk"
                android:textColor="@color/menu_nomarl"
                android:textSize="12sp"
                />
        </LinearLayout>
        <!-- 我的 -->
        <LinearLayout 
            android:id="@+id/ll_menu_me"
		    android:layout_width="0dp"
		    android:layout_height="wrap_content"
		    android:layout_weight="1"
		    android:gravity="center"
	    	android:orientation="vertical"
		    android:padding="5dp"
		    android:onClick="clickMenu"
            >
            <ImageView
                android:id="@+id/iv_menu_me" 
			    android:layout_width="wrap_content"
			    android:layout_height="wrap_content"
                android:background="@drawable/menu_me"
                android:contentDescription="@string/app_name"
                />
            <TextView 
                android:id="@+id/tv_menu_me"
			    android:layout_width="wrap_content"
			    android:layout_height="wrap_content"
                android:text="@string/menu_me"
                android:textColor="@color/menu_nomarl"
                android:textSize="12sp"
                />
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

2)MainActivity中处理点击不同菜单之后,如何变换展示内容的,先贴上这个类的代码:


package com.zym.app_frame;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends FragmentActivity {
	// 布局管理器
	private FragmentManager fManager;

	private FragmentHome fragment_home;
	private FragmentHot fragment_hot;
	private FragmentTalk fragment_talk;
	private FragmentMe fragment_me;
	
	// 首页
	private ImageView iv_menu_home;
	private TextView tv_menu_home;
	
	// 热点
	private ImageView iv_menu_hot;
	private TextView tv_menu_hot;
	
	// 留言
	private ImageView iv_menu_talk;
	private TextView tv_menu_talk;

	// 我的
	private ImageView iv_menu_me;
	private TextView tv_menu_me;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		// 初始化组件
		initViews();
		// 默认先点中第一个“首页”
		clickMenu(findViewById(R.id.ll_menu_home));
	}

	private void initViews() {
		// 布局管理器
		fManager = getSupportFragmentManager();
		
		iv_menu_home = (ImageView)findViewById(R.id.iv_menu_home);
		tv_menu_home = (TextView)findViewById(R.id.tv_menu_home);
		
		iv_menu_hot = (ImageView)findViewById(R.id.iv_menu_hot);
		tv_menu_hot = (TextView)findViewById(R.id.tv_menu_hot);

		iv_menu_talk = (ImageView)findViewById(R.id.iv_menu_talk);
		tv_menu_talk = (TextView)findViewById(R.id.tv_menu_talk);

		iv_menu_me = (ImageView)findViewById(R.id.iv_menu_me);
		tv_menu_me = (TextView)findViewById(R.id.tv_menu_me);
	}
	
	/**
	 * 点击底部菜单事件
	 * @param v
	 */
	public void clickMenu(View v){
		FragmentTransaction trans = fManager.beginTransaction();
		int vID = v.getId();
		// 设置menu样式
		setMenuStyle(vID);
		// 隐藏所有的fragment
		hideFrament(trans);
		// 设置Fragment
		setFragment(vID,trans);
		trans.commit();
	}

	/**
	 * 隐藏所有的fragment(编程初始化状态)
	 * @param trans
	 */
	private void hideFrament(FragmentTransaction trans) {
		if(fragment_home!=null){
			trans.hide(fragment_home);
		}
		if(fragment_hot!=null){
			trans.hide(fragment_hot);
		}	
		if(fragment_talk!=null){
			trans.hide(fragment_talk);
		}
		if(fragment_me!=null){
			trans.hide(fragment_me);
		}
	}

	/**
	 * 设置menu样式
	 * @param vID
	 * @param trans
	 */
	private void setMenuStyle(int vID) {
		// 首页
		if(vID==R.id.ll_menu_home){
			iv_menu_home.setImageDrawable(getResources().getDrawable(R.drawable.menu_home_click));
			tv_menu_home.setTextColor(getResources().getColor(R.color.menu_click));
		}else {
			iv_menu_home.setImageDrawable(getResources().getDrawable(R.drawable.menu_home));
			tv_menu_home.setTextColor(getResources().getColor(R.color.menu_nomarl));
		}
		// 热点
		if(vID==R.id.ll_menu_hot){
			iv_menu_hot.setImageDrawable(getResources().getDrawable(R.drawable.menu_hot_click));
			tv_menu_hot.setTextColor(getResources().getColor(R.color.menu_click));
		}else {
			iv_menu_hot.setImageDrawable(getResources().getDrawable(R.drawable.menu_hot));
			tv_menu_hot.setTextColor(getResources().getColor(R.color.menu_nomarl));
		}
		// 发言
		if(vID==R.id.ll_menu_talk){
			iv_menu_talk.setImageDrawable(getResources().getDrawable(R.drawable.menu_talk_click));
			tv_menu_talk.setTextColor(getResources().getColor(R.color.menu_click));
		}else {
			iv_menu_talk.setImageDrawable(getResources().getDrawable(R.drawable.menu_talk));
			tv_menu_talk.setTextColor(getResources().getColor(R.color.menu_nomarl));
		}
		// 我的
		if(vID==R.id.ll_menu_me){
			iv_menu_me.setImageDrawable(getResources().getDrawable(R.drawable.menu_me_click));
			tv_menu_me.setTextColor(getResources().getColor(R.color.menu_click));
		}else {
			iv_menu_me.setImageDrawable(getResources().getDrawable(R.drawable.menu_me));
			tv_menu_me.setTextColor(getResources().getColor(R.color.menu_nomarl));
		}
	}

	/**
	 * 设置Fragment
	 * @param vID
	 * @param trans
	 */
	private void setFragment(int vID,FragmentTransaction trans) {
		switch (vID) {
		case R.id.ll_menu_home:
			if(fragment_home==null){
				fragment_home = new FragmentHome();
				trans.add(R.id.content, fragment_home);
			}else{
				trans.show(fragment_home);
			}
			break;
		case R.id.ll_menu_hot:
			if(fragment_hot==null){
				fragment_hot = new FragmentHot();
				trans.add(R.id.content, fragment_hot);
			}else{
				trans.show(fragment_hot);
			}
			break;
		case R.id.ll_menu_talk:
			if(fragment_talk==null){
				fragment_talk = new FragmentTalk();
				trans.add(R.id.content, fragment_talk);
			}else{
				trans.show(fragment_talk);
			}
			break;
		case R.id.ll_menu_me:
			if(fragment_me==null){
				fragment_me = new FragmentMe();
				trans.add(R.id.content, fragment_me);
			}else{
				trans.show(fragment_me);
			}
			break;
		default:
			break;
		}
	}
}


代码有注释,大家应该能看懂,需要注意的几点是:

<1>因为使用到了Fragment,所以MainActivity需要继承FragmentActivity

<2>具体加载到哪个Fragment才会去生成,不会一次性生成所有的Fragment

关于Fragment的使用,大家有不清楚的具体去参考相关资料。


3)Fragment代码

4个Fragment做的比较简单,写一个其他复制就可以,代码如下:

package com.zym.app_frame;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class FragmentHome extends Fragment{

	private View view;// 需要返回的布局

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		if (view == null) {// 优化View减少View的创建次数
			view = inflater.inflate(R.layout.frag_home, null);
			return view;
		}
		return view;
	}
	
	
	
}

代码运行之后就直接可以看到效果了。


代码地址:

源代码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Fragment实现底部菜单的切换 的相关文章

  • 怎么在命令行里运行python脚本 (合集)

    在命令行里运行python脚本的方法 工具 原料 python CMD命令行 windows操作系统 方法 步骤 首先下载安装python 建议安装2 7版本以上 3 0版本以下 由于3 0版本以上不向下兼容 体验较差 打开文本编辑器 推荐
  • idea中git的简单使用及git分支

    这篇文章简单介绍了git 着重介绍了分支概念和idea中git的简单使用 提问题 git是啥 git的分支概念 idea中git的使用 git仓库 git命令 git安装 参考文章 git是个啥 分布式版本管理工具 git的前生今世 git
  • WiFi技术概述

    1 概述 WLAN是无线局域网络的简称 全称为Wireless Local Area Networks 是一种利用无线技术进行数据传输的系统 该技术的出现能够弥补有线局域网络之不足 以达到网络延伸之目的 Wi Fi是无线保真的缩写 英文全称
  • WSL2加载独立硬盘和设置固定IP

    最近发现了win10 包括win11 上的神器 Linux子系统 抱着玩一玩的态度安装了 琢磨了几天 逐步把Ubuntu完善起来了 发现完全可以当作WIN Linux双系统使用 还不用重启系统 作为生产力工具绰绰有余 总结了常用的工具软件和
  • 到底是学JAVA好还是.net,未来哪个前景好?

    Java就目前来看 前景绝对没有问题 从语言排行榜来看 Java从未跌出前3 Java目前主要占据两个领域 服务端开发 以及安卓开发 尤其是在安卓开发领域 绝对是牢牢地霸占第一的位置 首先java有着非常广泛的市场应用 WEB开发 安卓应用
  • 数组的添加和删除过滤方法总结es6 filter()

    es6 filter 数组过滤方法总结 Array every x gt x 是每一个都要满足 Array some x gt x 是有一个满足 Array find findIndex 返回符合条件的第一个值 Array filter 过
  • js复制一个对象的方法,不改变原对象

    复制一个对象 不改变原对象简单方法如下 var obj a 1 b 2 es6新方法 Object assign var newObj Object assign obj es6新方法 扩展运算符 var newObj obj 有个弊端 就
  • 不管人工智能发展如何 开发者都有必要了解 Linux 内核

    Linux内核在计算机世界的地位有目共睹 称它为计算机世界的基石也不为过 而且它还是全球最大的开源项目 几乎最知名的科技公司都参与其中 包括谷歌 Red Hat SUSE Intel Facebook 甲骨文和华为等 当然还包括Linux的
  • 腾讯云技术分享:MySQL AHI 实现解析

    MySQL 定位用户记录的过程可以描述为 打开索引 gt 根据索引键值逐层查找 B 树 branch 结点 gt 定位到叶子结点 将 cursor 定位到满足条件的 rec 上 如果树高为 N 则需要读取索引树上的 N 个结点并进行比较 如
  • java关于ArrayList,Vector,LinkedList,Set及其面试题+LeetCode136两种方式实现

    ArrayList ArrayList的遍历补充 将list转换为数组 使用toArray 方法将列表转换为数组 再对数组进行遍历 Test void test01 List
  • 大厂Code Review 流程

    提交cr的流程 检查代码风格 可以安装googlestyle或者Alibaba的一些stylecheck工具 也许各开发团队会有自己的风格规范 从mainline中同步代码 注意使用 git pull rebase 而不是 git pull
  • JAVA之初识springMVC框架

    1 环境 操作系统 Mac OS 10 12 6 Tomcat v7 0 JDK 1 7 工具 eclipse 2 新建项目 用eclipse新建项目 选择Dynamic Web Project 将项目字符集改为UTF 8 3 编辑web
  • RGMII信号是什么样子的----大揭秘

    RGMII信号 测试 1 测试RGMII 先判断RGMII信号频率多少 就知道是千兆百兆的模式 发送时钟信号 速率为Gbit s时 时钟速率为125MHz 速率为100Mbit s时 速率为25MHz 速率为10Mbit s时 速率为2 5
  • 【零知ESP8266教程】快速入门5-使用按键来控制你的灯

    上节课 我们已经学习了如何制作一个简易交通灯 那么如何去控制一个LED的亮或者灭呢 此次试验采用按键来控制我们的LED 实现LED的简单控制 一 工具原料 电脑 windows系统 ESP8266开发板 micro usb线 LED灯一个
  • 新人如何快速高效的学习Java?

    如果是新人 不想通过培训班 想学java 那么我可以很认真的告诉你 如果你是因为兴趣学学 那么你怎么学都可以 建议你找一些零基础入门的视频来学习 先看一遍 认识一下Java是个什么东西 如果是想转行学习 靠这个来工作 那么你就要好好的制定一
  • 三招搞定你的ubuntu安全问题

    本篇主要介绍以下三个部分 反病毒引擎clamav的安装和使用 ubuntu ufw限制访问地址 ubuntu用户连接失败锁定指定时间 反病毒引擎clamav的安装和使用 简介 ClamAV是一款开源的反病毒引擎 用于检测病毒 特洛伊木马 恶
  • mysql 字符集问题整理

    mysql 字符集问题整理 一直对mysql字符集没有明确的概念 mysql为了方便 设置了各种层级的字符集 最近在移植mat数据库时 顺便把这个问题整理清楚 供参考和学习 文章最后有word版本 有两张图片以及不同文字的颜色区分 首先是M
  • java入门的第一个程序代码 hello world

    很多人说 学Java真的很难 其实 这是真的 但是高薪之所以为高薪 就是因为它比普通的活难的多 今天是我第一篇的博客 我还是想鼓励想学java技术的小伙伴一起来学 很多事只有去做了 你才能知道自己能不能成功 好了 接下来看Java入门的第一
  • C#与Java的不同

    https www cnblogs com Yan3399 p 17324904 html 1 C 对应java中关键字 base super this this sealed final 1 base关键字 对应java super C
  • C#有像Java ThreadLocal的类似实现吗?

    在C 中 可以使用 ThreadLocal

随机推荐

  • CentOS 安装opencv3.4.12教程,一次编译通过,避免踩坑

    1 下载和安装 在官方网址 Home OpenCV 下载该3 x版本的opencv和opencv contrib的zip源码文件 本文以opencv3 4 12为例 然后解压该zip文件 即得到 unzip opencv 3 4 12 zi
  • 回调函数详解

    一 什么是回调函数 回调函数是指 使用者自己定义一个函数 实现这个函数的程序内容 然后把这个函数 入口地址 作为参数传入别人 或系统 的函数中 由别人 或系统 的函数在运行时来调用的函数 函数是你实现的 但由别人 或系统 的函数在运行时通过
  • 使用Glide对网络图片进行圆形和圆角的处理

    在开发中欧经常会遇见对图片的圆形和圆角的处理 头像一般圆形较多 之前使用的还是Volley ImageLoader来进行的加载网络图片 当时遇见这个需求找了许多资料 后来朋友一致推荐我将Volley ImageLoader换成Glide 不
  • 计算机毕设之基于SSM框架仓库管理系统

    1 简介 博主介绍 全网粉丝30W csdn特邀作者 博客专家 CSDN新星计划导师 编程领域优质创作者 博客之星 各平台优质作者 专注于Java python等技术领域和毕业项目实战 文末获取源码联系 计算机毕设之基于SSM框架仓库管理系
  • chatgpt赋能python:Python如何实现中文SEO的优化

    Python如何实现中文SEO的优化 伴随着互联网的发展 中文网站数量不断增多 而如何让中文网站在搜索引擎中更好的展现 就成为了一个很热门的问题 SEO 搜索引擎优化 是实现网站流量增长甚至盈利的关键 在这里 我们将介绍如何使用Python
  • VC++ 在任务栏图标上显示进度条效果

    该功能主要是通过COM接口ITaskbarList3 来实现进度效果显示功能 头文件定义 CSWTaskBarList h pragma once include
  • Android bundetool 详解

    android bundetool 详解 一 什么是 bundetool 为什么要使用 bundetool 在使用Android Studio 构建 Android App Bundle 后 需要测试 Android App Bundle
  • css设置背景图片大小_如何使用CSS设置背景图片大小?

    css设置背景图片大小 Introduction 介绍 As we all know that the images are a very responsive yet very creative way to display your w
  • WIN10去除磁盘写保护(只读属性)的步骤

    WIN10去除磁盘写保护 只读属性 的步骤 1 使用管理员权限进入win10的命令模式 使用系统搜索cmd 然后使用管理员模式打开 如下图 点击搜索 2 输入cmd 3 使用鼠标点击使用管理员身份打开 4 打开之后切换到C盘根目录 cd 这
  • 信号完整性分析基础知识之有损传输线、上升时间衰减和材料特性(一):为什么要关注损耗?

    一个具有极快上升沿的信号输入到真实传输线中 在从传输线输出的时候上升时间会很长 例如 一个上升时间为50ps的信号 在经过一段36inch长 50Ohm传输线后 上升时间增加到1ns 上升时间的退化是由于传输线的损耗 这也是引起码间干扰 i
  • TypeScript中的泛型(泛型函数、接口、类、泛型约束)

    一 泛型函数 TypeScript泛型是一种可以使代码具有更高的可重用性和泛化能力的特性 通过泛型 我们可以定义一种通用的类型或函数 使其能够应对多种类型的输入 泛型在类 函数 接口等多种场景下都可以使用 具体来说 在定义泛型函数时 我们可
  • 2022年SaaS发展趋势——私有本地化部署

    据麦肯锡 物联网 抓住加速机遇 报告预测 到2030年 物联网将在全球创造最高可达12 6万亿美元的经济价值 随着亚马逊 阿里云等云计算巨头不断加码投入 公有云IoT物联网平台因其低成本 易上手 高可靠等好处而被中小企业决策者广泛认可 然而
  • Vue中全局使用Spin组件

    如何全局使用 1 在man js引入Spin import Spin from ivew 2 将Spin挂载到Vue对象原型上 Vue prototype Spin Spin 3 在子组件调用 this Spin show
  • Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线程、多进程

    https zhuanlan zhihu com p 24283040 IO密集型任务 VS 计算密集型任务 所谓IO密集型任务 是指磁盘IO 网络IO占主要的任务 计算量很小 比如请求网页 读写文件等 当然我们在Python中可以利用sl
  • prometheus - node_exporter - CPU利用率(入门基础)

    node exporter CPU 一 获取 各种状态 CPU 的使用率 二 所用函数 1 increase time 增量函数 2 sum 叠加函数 3 by 拆分函数 二 计算 CPU 每分钟的 使用率 思路 步骤如下 1 计算CPU的
  • TCP三次握手与四次挥手

    本文主要讲述的是 1 面试官在问到TCP IP三次握手原理 以及为什么要三次握手 两次握手带来的不利后果 2 面试官问TCP IP四次挥手原理 为什么要四次挥手 TCP IP三次握手原理 首先 给张图片 建立TCP IP三次握手的直观印象
  • 计算机专业毕业设计题目大全文库,计算机专业毕业设计论文题目.doc

    计算机专业毕业设计论文题目 doc 由会员分享 可在线阅读 更多相关 计算机专业毕业设计论文题目 doc 43页珍藏版 请在金锄头文库上搜索 1 计计 算算 机机 专专 业业 毕毕 业业 设设 计计 论论 文文 目目 录录 ASP 类计算机
  • 最大股票收益问题(数组最大差问题)

    最大股票收益问题 数组最大差问题 问题描述 给定一个数组 存储着按照时间排序的股票价格 第 i i个位置的元素为第ii次交易时的股票价格 现假设只允许你进行一次买 然后在某一时刻卖出 单只股票 请设计算法 求解你可能获得的最大收益 如果股价
  • Windows下安装Redis

    打开redis中文官方网站 发现都需要安装在linux上 Windows版本的前往github上下载 地址 https github com microsoftarchive redis releases 由于需要外网比较难下载 所以放一个
  • 使用Fragment实现底部菜单的切换

    在做android项目的时候 经常会遇到底部有几个菜单 点击之后 页面上面部分需要展示不同的内容 如下图 在我的这个例子里面 采用了Fragment来展示点击下面菜单之后的不同数据 开发步骤 1 分析页面布局 页面分成底部菜单和上面的展示区