老套路看效果图:

说实话这个布局实现的思路太多了,自己写以及第三方都特别多,不过对于初学者还是从一点一滴开始学起比较简单也容易理解。直接上源码吧,我这个是用的最新的AndroidX库和Kotlin写的。

MainActivity.kt

package com.xiayiye.takeout.ui.activityimport android.os.Bundle
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import com.xiayiye.takeout.R
import com.xiayiye.takeout.ui.fragment.HomeFragment
import com.xiayiye.takeout.ui.fragment.MoreFragment
import com.xiayiye.takeout.ui.fragment.OrderFragment
import com.xiayiye.takeout.ui.fragment.UserFragment
import kotlinx.android.synthetic.main.activity_main.*class MainActivity : AppCompatActivity() {//添加所有页面的fragmentval list = listOf<Fragment>(HomeFragment(), OrderFragment(), UserFragment(), MoreFragment())override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)//下面是Kotlin语言查找id的方法
//        val mainBottomBar = findViewById<LinearLayout>(R.id.main_bottom_bar)initBottomBar()//默认选中第一个changeIndex(0)}private fun initBottomBar() {for (index in 0 until main_bottom_bar.childCount) {main_bottom_bar.getChildAt(index).setOnClickListener(object : View.OnClickListener {override fun onClick(p0: View?) {changeIndex(index)}})}}private fun changeIndex(index: Int) {for (position in 0 until main_bottom_bar.childCount) {val childView = main_bottom_bar.getChildAt(position)if (index == position) {senEnable(childView, false)} else {senEnable(childView, true)}}//点击哪个切换哪个fragment//Android的app包下
//        fragmentManager.beginTransaction().replace(R.id.main_content, list[index])//AndroidX的app包下supportFragmentManager.beginTransaction().replace(R.id.main_content, list[index]).commit()}private fun senEnable(childView: View, isEnabled: Boolean) {childView.isEnabled = isEnabledif (childView is ViewGroup) {for (position in 0 until childView.childCount) {childView.getChildAt(position).isEnabled = isEnabled}}}
}

再看下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"android:orientation="vertical"tools:context=".ui.activity.MainActivity"><FrameLayoutandroid:id="@+id/main_content"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:background="@null" /><LinearLayoutandroid:id="@+id/main_bottom_bar"android:layout_width="match_parent"android:layout_height="50dp"android:layout_marginBottom="2dp"android:baselineAligned="false"android:orientation="horizontal"><FrameLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"><ImageViewandroid:layout_width="match_parent"android:layout_height="30dp"android:contentDescription="@string/text_home"android:src="@drawable/main_home_selector" /><TextViewandroid:layout_width="wrap_content"android:layout_height="20dp"android:layout_gravity="bottom|center"android:text="@string/text_home"android:textColor="@drawable/main_bottom_text_color" /></FrameLayout><FrameLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"><ImageViewandroid:layout_width="match_parent"android:layout_height="30dp"android:contentDescription="@string/text_order"android:src="@drawable/main_order_selector" /><TextViewandroid:layout_width="wrap_content"android:layout_height="20dp"android:layout_gravity="bottom|center"android:text="@string/text_order"android:textColor="@drawable/main_bottom_text_color" /></FrameLayout><FrameLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"><ImageViewandroid:layout_width="match_parent"android:layout_height="30dp"android:contentDescription="@string/text_personal"android:src="@drawable/main_me_selector" /><TextViewandroid:layout_width="wrap_content"android:layout_height="20dp"android:layout_gravity="bottom|center"android:text="@string/text_personal"android:textColor="@drawable/main_bottom_text_color" /></FrameLayout><FrameLayoutandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"><ImageViewandroid:layout_width="match_parent"android:layout_height="30dp"android:contentDescription="@string/text_more"android:src="@drawable/main_more_selector" /><TextViewandroid:layout_width="wrap_content"android:layout_height="20dp"android:layout_gravity="bottom|center"android:text="@string/text_more"android:textColor="@drawable/main_bottom_text_color" /></FrameLayout></LinearLayout>
</LinearLayout>

简单说下思路:

就是下面放四个FrameLayout。然后每个FrameLayout里面放图片和文字总共四组,然后分别设置图片和文字的enable属性为selector选择器,设置好了后,在mainactivity里面通过拿到四个FrameLayout的父布局LinearLayout然后遍历它的子布局,设置每个子布局的点击事件,点击哪个子布局切换哪个fragment,然后判断子布局是否还有子布局,如果有就根据父布局是否可enable设置相应的enable属性即可。

需要源码的点击下载即可:源码下载

Android开发之最简单的布局点击Tab和Fragment切换源码(特别适合初学者)相关推荐

  1. Android开发之跨进程通信-广播跨进程实现方法(附源码)

    真的特别简单,简单概述下android的四大组件都可以跨进程. Activity,广播,服务,内容提供者都可以 先看下跨进程传递数据的效果图 下面是两个APP用于模拟跨进程 再看下跨进程效果,AIDL ...

  2. Android开发必会技术!Flutter中网络图片加载和缓存源码分析,完整PDF

    起因 事情是这样的. 4年前毕业那会,呆在公司的短视频项目,做 视频.那会做得比抖音还早,但是由于短视频太烧钱了,项目被公司关掉了.当时需要开发横竖屏直播/异步视频的场景,就研究下了市场上的 app, ...

  3. Android开发:实现简单的问卷调查

    Android开发:实现简单的问卷调查 1.activity_main.xml 主界面整体是由ScrollView控件控制,ScrollView它继承自FrameLayout,所以它是一种特殊类型的F ...

  4. android 开发零起步学习笔记(二十二):ANDROID应用ACTIVITY、DIALOG、POPWINDOW、TOAST窗口添加机制及源码分析(一)

    原文:http://www.cnblogs.com/shanzei/p/4654817.html 第一部分: ANDROID应用ACTIVITY.DIALOG.POPWINDOW.TOAST窗口添加机 ...

  5. android仿疯狂猜图源码,Android开发实现高仿优酷的客户端图片左右滑动切换功能实例【附源码下载】...

    本文实例讲述了Android开发实现高仿优酷的客户端图片左右滑动切换功能.分享给大家供大家参考,具体如下: 本例是用ViewPager去做的实现,支持自动滑动和手动滑动,不仅优酷网,实际上有很多商城和 ...

  6. java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署

    java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署 本源 ...

  7. Android Fragment 从源码的角度去解析(上)

    ###1.概述 本来想着昨天星期五可以早点休息,今天可以早点起来跑步,可没想到事情那么的多,晚上有人问我主页怎么做到点击才去加载Fragment数据,而不是一进入主页就去加载所有的数据,在这里自己就对 ...

  8. 个人HTML期末大作业~ 个人网页(HTML+CSS)6页面带下拉特效~简单带表格带设计说明 ~学生网页设计作业源码

    HTML期末大作业~ 个人网页6页面带下拉特效~简单带表格带设计说明 ~学生网页设计作业源码 作品介绍 下面介绍一下我的个人小网站吧,我的网站背景稍微单调一点白色,主要个人比较喜欢白色了,布局上面使用 ...

  9. Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/53939176 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭 ...

最新文章

  1. 一条直线上N个线段所覆盖的总长度
  2. 90 vuex axios
  3. 你最喜欢的一张美女图片?
  4. Linux内核中container_of宏的理解
  5. vb教材笔记_VB课堂笔记-----第五章 数据的输入与输出
  6. Socket IO多路复用: epoll原理图解
  7. Java基础(1):Java简介和开发环境配置
  8. Vlan配置详解之三层交换
  9. C#会对于未赋值的变量/成员变量,给予一个初始值吗?
  10. Red and Black(红与黑)BFS
  11. Windows下PHP安装配置
  12. Elasticsearch2.4.X 搜索引擎框架 安装配置
  13. bitset java 源码_【JAVA】BitSet的源码研究
  14. VSCode插件Code Runner用于C++
  15. solar2 android,Solar2(太阳系行星2)
  16. WPS表格-快速展开全部隐藏行
  17. 网页显示服务器拒绝了链接,网页出现服务器拒绝链接
  18. 博客书写-教师节收益
  19. 计算机音乐谱大全好汉歌,好汉歌民谣简谱
  20. android H5开发出现广告,常见的移动端H5页面开发遇到的坑和解决办法

热门文章

  1. 为什么刹车热了会失灵_网曝比亚迪汉“刹车失灵”,比亚迪称:是IPB模块仪表显示问题...
  2. 嵌入式linux应用程序开发详解_【精品套餐】嵌入式linux应用驱动开发完全学习路线...
  3. 选择行_外出旅游你会选择自由行还是跟团游?
  4. 千本樱计算机音乐谱,【C型】我来发几个谱子 【千本樱】【权御天下】
  5. ios 隔空投安装ipa_ipa文件是什么?怎么安装ipa文件到苹果手机上?
  6. 怎么查MATLAB中的newrbf,已经有了输入输出数据,如何在matlab中建立RBF神经网络
  7. integer是值传递还是引用传递_值传递与引用传递
  8. linux查看nginx、apache、php、php-fpm、mysql及配置项所在目录
  9. sqlserver改主键初始ID
  10. 机器学习系统设计——误差矩阵