【Android入门到项目实战-- 11.2】—— 实现底部导航栏(RadioGroup+Fragment)

news2024/11/15 15:50:02

实现效果

        效果如下,使用RadioGroup实现,不能左右滑动切换页面,适用于导航页里还有需要切换页面的场景,如果需要滑动效果,使用ViewPager实现。

 准备工作

        以下示例按照图上实现,具体多少个页面,按需修改。

        由于需要用到icon,提前下载好图标到drawable文件。

 

        提前定义好样式

        在values文件下新建styles.xml,用作fragment的布局样式,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="fragment">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">match_parent</item>
        <item name="android:padding">5dp</item>
        <item name="android:gravity">center</item>
        <item name="android:textColor">@drawable/rb_text_color</item>
        <item name="android:textSize">10dp</item>
        <item name="android:textStyle">normal</item>
    </style>

</resources>

        首页的选择图标样式,在drawable文件下新建rb_home_selector.xml,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/home2" android:state_selected="true" />
    <item android:drawable="@drawable/home" />
</selector>

        个人页面图标,drawable下新建rb_mine_selector.xml,如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/mine2" android:state_selected="true" />
    <item android:drawable="@drawable/mine" />
</selector>

         选择页面时的字体样式,drawable下新建rb_text_color.xml,如下;

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:color="#1296db"/>
    <item android:color="#808080"/>
</selector>

代码实现

activity_main.xml代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <FrameLayout
        android:id="@+id/fragment_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        />

    <RadioGroup
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/rg_group"
        android:layout_alignParentBottom="true"
        android:background="#ffff"
        android:orientation="horizontal"
        >
        <RadioButton
            android:id="@+id/rb_home"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:button="@null"
            style="@style/fragment"
            android:drawableTop="@drawable/rb_home_selector"
            android:text="首页"
            />
        <RadioButton
            android:id="@+id/rb_mine"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:button="@null"
            style="@style/fragment"
            android:drawableTop="@drawable/rb_mine_selector"
            android:text="我的"
            />
    </RadioGroup>
</RelativeLayout>

MainActivity类如下:

public class MainActivity extends AppCompatActivity implements RadioGroup.OnCheckedChangeListener {

    private RadioButton rb_home,rb_mine;
    private RadioGroup rg_group;
    private List<Fragment> fragments;
    private int position=0;
    private static final String TAG = "MainActivity";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.getSupportActionBar().hide();//去除标题栏

        rb_home=findViewById(R.id.rb_home);
        rb_mine=findViewById(R.id.rb_mine);
        rg_group=findViewById(R.id.rg_group);

        //默认选中第一个
        rb_home.setSelected(true);

        rg_group.setOnCheckedChangeListener(this);

        //初始化fragment
        initFragment();

        //默认布局,选第一个
        defaultFragment();
    }

    private void defaultFragment() {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.fragment_layout,fragments.get(0));
        transaction.commit();
    }

    private void setSelected() {
        rb_home.setSelected(false);
        rb_mine.setSelected(false);
    }

    private void initFragment() {
        fragments = new ArrayList<>();
        fragments.add(0,new homeFragment());
        fragments.add(1,new mineFragment());
    }

    @Override
    public void onCheckedChanged(RadioGroup group, int i) {
        //获取fragment管理类对象
        FragmentManager fragmentManager = getSupportFragmentManager();
        //拿到fragmentManager的触发器
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        switch (i) {
            case R.id.rb_home:
                position = 0;
                //调用replace方法,将fragment,替换到fragment_layout这个id所在UI,或者这个控件上面来
                //这是创建replace这个事件,如果想要这个事件执行,需要把这个事件提交给触发器
                //用commit()方法
                transaction.replace(R.id.fragment_layout, fragments.get(0));
                //将所有导航栏设成默认色
                setSelected();
                rb_home.setSelected(true);
                break;
            case R.id.rb_mine:
                position = 1;
                transaction.replace(R.id.fragment_layout, fragments.get(1));
                //将所有导航栏设成默认色
                setSelected();
                rb_mine.setSelected(true);
                break;
        }
        //事件的提交
        transaction.commit();
    }

}

        如下图操作新建fragment类,一起创建xml文件

         homeFragment.java代码:这个类写页面的具体逻辑

public class homeFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_home, container, false);
        return view;
    }
}

        mineFragment类和上面一样,略。

        fragment_home.xml和fragment_mine.xml里按需写页面的布局就可以了。

完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/547464.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++刷题集】-- day2

目录 选择题 单选 编程题 OR62 倒置字符串⭐ 【题目解析】 【解题思路1】 【解题思路2】 【解题思路3】 排序子序列⭐ 【题目解析】 【解题思路】 选择题 单选 1、使用printf函数打印一个double类型的数据&#xff0c;要求&#xff1a;输出为10进制&#xff0c;输…

儿童教育软件推荐

1、出口算题系统 胡迪数学运算练习 2、迪乐姆是上海和盛实业集团有限公司注册的教育品牌&#xff0c;涵盖人工智能、科学、艺术、运动、创造力等多元教育领域&#xff0c;提供自主知识产权的全套课程产品、师资培养体系、环境创设实施等一站式素质教育个性化服务。 [1] 截止到…

【Proteus仿真】51单片机串口输出实验

【Proteus仿真】51单片机串口输出实验 &#x1f4cc;相关篇《【Proteus仿真】51单片机Blink点灯实验》&#x1f516;Proteus仿真基础实验-串口输出。&#x1f33f;Proteus8.12平台&#x1f33f;本实验代码基于VSM Studio&#xff0c;采用SDCC编译器。&#x1f33f;调试串口波特…

计算机图形学-GAMES101-12阴影

Shadow mapping 问题的提出 我们之前在进行着色时&#xff0c;对于每个物体仅考虑自己&#xff0c;而不考虑其他物体对它的影响。限定在光栅化中&#xff0c;如何解决阴影问题呢&#xff1f;阴影能被摄像机看到&#xff0c;但不能被光源所照亮。经典的Shadow mapping只能处理…

POSTGRESQL EDB 企业版 PG 15 独有功能

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

基于SpringBoot的人事管理系统的设计与实现

背景 人事管理管理方面的任务繁琐,以至于公司每年都在人事管理这方面投入较多的精力却效果甚微,人事管理系统的目标就是为了能够缓解人事管理工作方面面临的压力,让人事管理方面的工作变得更加高效准确。 系统架构 考虑到实际生活中在人事管理方面的需要以及对该系统认真的分…

由浅入深Netty粘包与半包解决方案

目录 1 粘包现象2 半包现象3 现象分析4 解决方案4.1 方法1&#xff1a;短链接4.2&#xff1a;方法2&#xff1a;固定长度4.3 方法3&#xff1a;固定分隔符4.4 方法4&#xff1a;预设长度 1 粘包现象 服务端代码 public class HelloWorldServer {static final Logger log Logg…

ARM的基本数据处理指令与条件代码的使用

最开始在此介绍一下CPSR寄存器中 N、Z、C、V 4位的作用&#xff1a; Bit[28]&#xff08;V&#xff09;&#xff1a; 当运算器中进行加法运算且产生符号位进位时该位自动置1&#xff0c;否则为0 当运算器中进行减法运算且产生符号位借位时该位自动置0&#xff0c;否则为1 …

js 多个小程序之间互相跳转,a小程序带参跳转到b小程序中

小程序中实现两个或者多个小程序之间互相跳转&#xff0c;a小程序带参跳转到b小程序中。 官方入口&#xff1a;wx.navigateToMiniProgram(Object object) https://developers.weixin.qq.com/miniprogram/dev/api/navigate/wx.navigateToMiniProgram.html 实现步骤&#xff1a; …

English Learning - L3 综合练习 3 VOA-Food 2023.05.17 周三

English Learning - L3 综合练习 3 VOA-Food 2023.05.17 周三 句 1句 2句 3句 4句 5句 6句 7句 8句 9句 10句 11句 12句 13句 14句 15结尾&#xff1a;注意力和记忆力&#xff0c;都是需要开垦的 句 1 注意后面的介词短语是当定语的 我们提供更多有关食物的表达。 they are f…

21 排序

文章目录 排序排序的基本概念排序方法的分类 插入排序直接插入排序性能分析代码实现 折半插入排序性能分析代码实现 希尔排序性能分析代码实现 交换排序冒泡排序分析和改进拓展&#xff08;提高冒泡效率的方法&#xff09;短路冒泡代码实现双向冒泡法&#xff08;鸡尾酒排序&am…

跟着NC学cfDNA全基因组片段化丰度谱分析

继续我们的跟着NC学系列&#xff0c;前面分享的是关于16S扩增子测序和宏基因组数据分析的。考虑到我们有许多小伙伴是做人类基因组方面的&#xff0c;这次分享一篇癌症早筛方面的&#xff0c;血液DELFI全基因组片段化丰度谱检测的分析框架。题目是&#xff1a;Detection and ch…

Fast-RCNN网络详解

文章目录 一、前言二、Fast-RCNN原理步骤2.1候选区域的生成2.2.ROI Pooling层2.3.分类器2.4.边界框的预测2.5.损失计算2.5.1.分类损失2.5.2.边界框回归损失 三、总结参考博客与视频、代码 一、前言 前面学习了SS算法、R-CNN网络&#xff0c;接下来继续学习Fast-RCNN网络。 本…

KingbaseES V8R3 备份恢复系列之 -- sys_rman备份过程分析

​ 案例说明&#xff1a; 本案例通过对KingbaseES sys_rman物理备份过程的详细描述&#xff0c;有助于在执行sys_rman过程中发生故障的分析。适用版本&#xff1a; KingbaseES V8R3 一、sys_rman执行过程简介 1. 调用select sys_start_backup()开始备份&#xff0c;sys_start_b…

028python-配置文件

配置文件&#xff1a;以properties 、config、ini、log4j等结尾的都是配置文件&#xff0c;里面的参数改一下&#xff0c;项目就可以按照不同的方式执行出来&#xff1b; configparser 可以去读取配置信息&#xff0c;configparser里面的类模块ConfigParser&#xff1b;配置文件…

SpringMVC 笔记

1. SpringMVC 简介 1.1 什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型、视图、控制器来划分 M&#xff1a;Model&#xff0c;模型层&#xff0c;指工程中的JavaBean&#xff0c;作用是处理数据 JavaBean分为两类&#xff1a; 一类称为实体类Bean&#xff…

Linux安装Docker(这应该是你看过的最简洁的安装教程)

Docker是一种开源的容器化平台&#xff0c;可以将应用程序及其依赖项打包成一个可移植的容器&#xff0c;以便在不同的环境中运行。Docker的核心是Docker引擎&#xff0c;它可以自动化应用程序的部署、扩展和管理&#xff0c;同时还提供了一个开放的API&#xff0c;可以与其他工…

一文带你了解MySQL之连接原理

前言 本文章收录在MySQL性能优化原理实战专栏&#xff0c;点击此处查看更多优质内容。 搞数据库一个避不开的概念就是Join&#xff0c;翻译成中⽂就是连接。相信很多小伙伴初学连接的时候有些一脸懵&#xff0c;理解了连接的语义之后又可能不明白各个表中的记录到底是怎么连起…

用iOS版ChatGPT第一步:手把手带你注册美区Apple ID!(史上最简单)

大家好&#xff0c;我是鸟哥。 前两天ChatGPT官方毫无征兆的上线了iOS版&#xff0c;和网页版的相比功能和响应速度都提升了N个档次&#xff0c;具体看这篇文章&#xff1a;iOS版ChatGPT突然上线&#xff01;Plus用户笑疯了&#xff01; 但是呢&#xff0c;目前iOS版只在美区…

玩客云刷NAS

测试路由器支持IPV6 参考 这里 我用的是TPlink WDR7660 支持IPV6 主要设置桥模式 玩客云刷写固件 参考 这里 还有这里 玩客云固定IP 参考这里 sudo armbian-config 选择Network 选择有线网络->ip 选择static 然后根据自己情况进行设置 点击OK即可 更新国内源 参考这里 证书…