使用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实现底部菜单的切换 的相关文章

  • springBoot的序列化与反序列化

    springboot中的序列化与反序列化有一个相对比较复杂的转换过程 它主要是HTTP请求 响应的信息类型转换 包含编码 信息类型 信息转换器 注解方法的处理适配器 请求接收的信息处理器等等 我们就先从大家常用的RequestBody和Re
  • 怎么在命令行里运行python脚本 (合集)

    在命令行里运行python脚本的方法 工具 原料 python CMD命令行 windows操作系统 方法 步骤 首先下载安装python 建议安装2 7版本以上 3 0版本以下 由于3 0版本以上不向下兼容 体验较差 打开文本编辑器 推荐
  • 第三节课总结之关于this指向,变量提升以及跨域的解决方案

    this 变量提升 关于继承 跨域解决方法 gt gt this指向 Js是静态作用域 是在定义阶段就决定好了的 而不是在执行阶段才决定的 参考资料 https developer mozilla org en US docs Web Ja
  • vue函数定义的多种写法

    vue定义方法 methods a e c alert aaa a e c alert aaa a function e c alert aaa 在JS中箭头函数根据是否书写大小括号可分为以下四种情况 不省略 const fun value
  • 华为机试(字符串消消乐---Java实现)

    package test import java util Scanner 消消乐 字符串 描述 给定一个只包含大小写字母的字符串 大小写敏感 若相邻两个元素相等则消除 直到最后字符串消除不了了 输出消消乐后字符串的长度 若遇到非大小写字母
  • Merkle Patricia Tree (MPT) 以太坊merkle技术分析

    一 传统merkle树缺陷 我的这篇博客merkle tree 分析 详细解释了merkle树的原理和作用 然而传统的merkle树有他的局限性 以下对Vitalik blog原文的翻译可以很好的阐述 传统merkle树的一个特别的限制是
  • java转go语言,值得转吗?

    有这个想法的不在少数了 也就意味着这条路并不是想想的那样 Java确实比以前卷了 但是你能保证转过去比别人做的更好 别拿自己的劣势跟别人的优势争 先守好自己的一亩三分地 把技术提高一个层次 相对来说卷的人数就少了 其实拿GO语言和JAVA相
  • 以后就在这里写技术学习笔记啦

    以后就在这里写技术学习笔记啦 想用印象笔记 但是觉得还是来这里写比较好 在这里写 不好的地方 接受别人的批评
  • Go语言值不值得学,发展前景怎么样?

    我学习了java和golang java用了5年 无限感慨java的生态 工业级的语言 无数的解决方案 不管你是做互联网还是传统行业的开发用java开发总能解决一切很多的问题 国内巨头阿里巴巴更是把java推向了极致 golang作为一个新
  • android 之 如何让app没有图标

    我们有时候需要让我们的app没有图标 不要问我没有图标要干啥 我只是说的一个需求 单讲技术不说别的 首先我们要获得 PackageManager 的对象 PackageManager packageManager getPackageMan
  • 计算机网络系列--TCP 篇

    TCP 是因特网协议栈中运输层 传输层 常用的协议 该协议的全称为 Transmission Control Protocol 传输控制协议 它提供了一种可靠的数据传输 而因特网协议栈中运输层的另一种常用的协议则不提供可靠的数据传输 它在网
  • 前端,后端,全栈哪个好找工作?

    职场老油子说说 现在啥岗位不好找工作 啥 想钱多 活少 离家近 最好单位发异性 这得靠实力 运气 如果是刚毕业 啥都不懂但又想从事技术行业 可以到职场上历练 而不是说报个培训机构 他们只能解决你的焦虑问题 而不是实际问题 如果只是混个工作
  • 程序员技术面常用知识点

    转自 http blog csdn net qq 15437629 article details 52388685 在这里只做备份 计算机网络 TCP IP 模型 TCP IP协议集的分层实施 为什么要给网络划分层次 1 各层之间相对独立
  • 用Docker部署自己的JupyterHub

    话在前头 用 Docker 部署 JupyterLab 感觉是部署 JupyterLab 最方便的方式了 官方提供了很多可选的镜像 也可以自己从 jupyter base notebook 中继续打包 镜像启动命令加上 NotebookAp
  • 新手如何学习网络安全?

    每天都有新闻报道描述着新技术对人们的生活和工作方式带来的巨大乃至压倒性影响 与此同时有关网络攻击和数据泄露的头条新闻也是日益频繁 攻击者可谓无处不在 企业外部充斥着黑客 有组织的犯罪团体以及民族国家网络间谍 他们的能力和蛮横程度正日渐增长
  • 三招搞定你的ubuntu安全问题

    本篇主要介绍以下三个部分 反病毒引擎clamav的安装和使用 ubuntu ufw限制访问地址 ubuntu用户连接失败锁定指定时间 反病毒引擎clamav的安装和使用 简介 ClamAV是一款开源的反病毒引擎 用于检测病毒 特洛伊木马 恶
  • Nginx日志常见时间变量解析

    request time 官方解释 request processing time in seconds with a milliseconds resolution time elapsed between the first bytes
  • 移动端H5开发遇到的问题

    移动端开发必会出现的问题和解决方案 H5开发过程中难免会遇到一些兼容性等爬过坑的问题 移动端 H5 相关问题汇总 1px 问题 响应式布局 iOS 滑动不流畅 iOS 上拉边界下拉出现白色空白 页面件放大或缩小不确定性行为 click 点击
  • ySql.Data.Types.MySqlConversionException: Unable to convert MySQL date/time value to System.DateTime

    public DateTime Createtime MySql Data Types MySqlConversionException Unable to convert MySQL date time value to System D
  • 一致性哈希算法,hash(key)是负值时,会出现异常吗?

    一致性哈希算法 hash key 是负值时 会出现异常吗 一致性哈希算法中 哈希函数hash key 的返回值通常是一个非负整数 如果hash key 返回负值 则可能会出现一些问题 例如无法正确地映射对象到哈希环上的位置 或者无法正确地找

随机推荐

  • 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 分析页面布局 页面分成底部菜单和上面的展示区