Kotlin 开发Android app(十三):RadioGroup和ViewPager控件实现底层分页按钮

news2024/11/24 17:01:35

安卓的控件是挺多的,没有办法一个一个的来说明,我们挑出了一些重点的控件,组成一些常见的布局,这样以后在遇到相同功能的界面时,就会有自己的思路,或者进行复用。

在这里插入图片描述

在这一节中,我们实现一个底层分页按钮。

在这里插入图片描述

实现这种布局有非常的多的方式,这里我们采用的是RadioGroupViewPager 实现这种界面形式。

ViewPager 中用适配器装载4个不同的Fragment,当ViewPager 滑动或者RadioGroup 有点击的时候,选择到相应的Fragment 中,进行展示。

这就是我们实现分页按钮的思路。

主布局 activity_main

在主布局中,我们使用了 4个的RadioButton 放在一组 RadioGroup 中,使得layout_alignParentBottom 为真,让他一直放在界面的底部。

一个ViewPager,用来装载不同的界面。

<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">


    <RadioGroup
        android:id = "@+id/rg_tab_bar"
        android:layout_width="match_parent"
        android:layout_alignParentBottom="true"
        android:layout_height="50dp"
        android:background="@color/white"
        android:orientation="horizontal">

        <RadioButton
            android:id="@+id/rb_home"
            android:text="主页"
            android:button="@null"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:drawableTop="@drawable/tab_menu_home"
            android:gravity="center">

        </RadioButton>

        <RadioButton
            android:id="@+id/rb_query"
            android:text="查询"
            android:button="@null"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:drawableTop="@drawable/tab_menu_query"
            android:gravity="center">

        </RadioButton>

        <RadioButton
            android:id="@+id/rb_predict"
            android:text="预测"
            android:button="@null"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:drawableTop="@drawable/tab_menu_predict"
            android:gravity="center">

        </RadioButton>

        <RadioButton
            android:id = "@+id/rb_user"
            android:text="个人中心"
            android:button="@null"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent"
            android:drawableTop="@drawable/tab_menu_user"
            android:gravity="center">

        </RadioButton>



    </RadioGroup>

    <androidx.viewpager.widget.ViewPager
        android:id ="@+id/vpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/rg_tab_bar"/>

</RelativeLayout>

刚好我们使用的是RelativeLayout 的布局方式,android:layout_above 要进行相应的设置,不然RadioButton 可能会点击不到。

适配器

创建是个不同的Fragment 分别为 HomeFragmentQueryFragmentPredictFragmentUserFragment

把适配器中,加载进 这四个Fragment

class MyFragmentPagerAdapter(fm:FragmentManager) : FragmentPagerAdapter(fm) {
    private var homeF:HomeFragment = HomeFragment()
    private var queryF:QueryFragment = QueryFragment()
    private var preF:PredictFragment = PredictFragment()
    private var userF:UserFragment = UserFragment()
    
    override fun getCount(): Int {
        return 4
    }
    override fun getItem(position: Int): Fragment {
        var fragment =  when(position){
            0 -> {homeF}
            1 ->{queryF}
            2 ->{preF}
            3 ->{userF}
            else -> {homeF}
        }
        return fragment
    }
}

主页面的控制

有了前面的准备以后,在主界面中需要设置下ViewPagerRadioButton 使得 程序的点击事件和滚动事件,确定我们选定的界面。

class MainActivity : AppCompatActivity(), RadioGroup.OnCheckedChangeListener,ViewPager.OnPageChangeListener
{
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        rg_tab_bar.setOnCheckedChangeListener(this)

        vpager.adapter = MyFragmentPagerAdapter(supportFragmentManager)
        vpager.setCurrentItem(0)
        rb_home.isChecked = true
        vpager.setOnPageChangeListener(this)
    }

    override fun onCheckedChanged(p0: RadioGroup?, p1: Int) {

        when(p1){
            R.id.rb_home->{vpager.setCurrentItem(0)}
            R.id.rb_query ->{vpager.setCurrentItem(1)}
            R.id.rb_predict ->{vpager.setCurrentItem(2)}
            R.id.rb_user ->{vpager.setCurrentItem(3)}
        }

    }

    override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {

    }

    override fun onPageSelected(position: Int) {

    }

    override fun onPageScrollStateChanged(state: Int) {

        if (state == 2){
            when(vpager.currentItem){
                0 -> rb_home.isChecked = true
                1 -> rb_query.isChecked = true
                2 -> rb_predict.isChecked = true
                3 -> rb_user.isChecked = true
            }
        }

    }
}

小结

这节应该是我们最后一节写控件的东西了,控件的东西很多,而且比较难理解,还需要不停的进行学习和总结,我们后面还会有不同的专题来介绍,有时间可以多看看别人写的控件,来丰富我们做界面的思路路。

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

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

相关文章

CANoe-vTESTstudio之State Diagram编辑器(元素介绍)

State Diagram编辑器里的工具箱,有多个图形符号,它们是组成状态图表的图形元素,具有不同的作用。图形元素能够高效并快速地创建状态图表,然后生成测试用例 1. 基本测试设计元素 1.1 Setup Setup元素的测试代码能够执行一次,在检查测试用例之前。例如,用于建立诊断连接 …

uni-app接入mPaas扫码

目录 原因 配置mPaas应用 包名和打签名APK 使用云端插件 打自定义基座 原因 可以用uni.scanCode扫一下下面的二维码&#xff0c;会发现&#xff0c;左边的识别不了&#xff0c;而右边的能识别&#xff0c;其实人眼看&#xff0c;两个二维码应该是一样的。 只不过左边的会有…

String的几个面试题

1.. 第一个只出现一次的字符 class Solution {public int firstUniqChar(String s) {int []count new int[125];for(int i0;i<s.length();i){char chs.charAt(i);count[ch];}for(int i0;i<s.length();i) {char ch s.charAt(i);if (count[ch] 1) {return i;}}return -1…

网站被DDOS攻击怎么办?防护经验!

为了能够及时发现ddos攻击&#xff0c;下面我们就详细介绍一下网站受ddos攻击的症状&#xff1a; 网站遇到ddos攻击的表现之一&#xff1a;服务器CPU被大量占用 ddos攻击其实是一种恶意性的资源占用攻击&#xff0c;攻击者利用肉鸡或者攻击软件对目标服务器发送大量的无效请求&…

详解设计模式:代理模式

代理模式&#xff08;Proxy Pattern&#xff09;&#xff0c;Java 常见的设计模式之一&#xff0c;是 GoF 的 23 种设计模式中的一种结构型设计模式。 代理模式 是指客户端并不直接调用实际的对象&#xff0c;而是通过调用代理对象&#xff0c;来间接的调用实际的对象。代理对象…

矢量三维电磁铁的技术参数

产品介绍&#xff1a; 锦正茂自主研发的多极电磁铁以四极电磁铁居多&#xff0c;也有五极、六极、八极等多极的应用&#xff0c;主要应用于多极磁环充磁、径向梯度磁场、旋转磁场磁导向等多种应用。 产品用途&#xff1a; 电磁铁/电磁场发生器主要用于磁滞现象研究、磁化系数测…

SAP-S4 BP 业务伙伴(客户与供应商)管理后台配置

目录 一、定义业务伙伴角色 二、客户和BP主数据同步配置 三 、激活对话中平台对象的PPo请求 四、勾选活动的同步选项 五、定义编码范围 ​编辑 六、 设置客户与供应商的编码范围 一、定义业务伙伴角色 业务伙伴 IMG路径 &#xff1a; 跨应用组件->SAP业务伙伴 -> …

热门Java开发工具IDEA入门指南——如何配置IDE

IntelliJ IDEA&#xff0c;是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能是非常强大的。 上文…

HarmonyOS应用API手势方法-PinchGesture

描述&#xff1a;用于触发捏合手势&#xff0c;触发捏合手势的最少手指为2指&#xff0c;最大为5指&#xff0c;最小识别距离为3vp。 Api&#xff1a;从API Version 7开始支持 接口&#xff1a;PinchGesture(value?: { fingers?: number, distance?: number }) 参数&…

【Android App】实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)

需要全部代码请点赞关注收藏后评论区留言私信~~~ 手机最开始用于通话&#xff0c;后来增加了短信功能&#xff0c;初步满足了人与人之间的沟通需求。然而短信只能发文字&#xff0c;于是出现了能够发图片的彩信&#xff0c;但不管短信还是彩信&#xff0c;资费都太贵了&#xf…

极光Q3财报解读:营收稳健控费见效 估值修复空间巨大

极光似乎正在渡过转型阵痛期。 11月23日&#xff0c;极光移动股份有限公司(JG.US)公布了2022年第三季度未经审计财务业绩&#xff0c;营收1130万美元&#xff0c;环比上升6%&#xff0c;同比降幅收窄&#xff0c;虽然低于市场预期的1214万美元&#xff0c;但是客户总数同比增长…

[Java反序列化]—CommonsCollections5

先贴张其他师傅的图 其实 CC5就是CC1的一种变形&#xff0c;前半段改修一下&#xff0c;后面接上就是CC5了。CC1是通过AnnotationInvocationHandler.invoke()获取get()&#xff0c;而CC5则是通过TiedMapEntry.toString()&#xff0c;其余部分都是一样的 分析 看看TiedMapEntr…

[附源码]Python计算机毕业设计Django-大学生健康档案管理

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Codeforces Round #836 (Div. 2) A.B.C.D

A. SSeeeeiinngg DDoouubbllee 题目链接&#xff1a; Problem - A - Codeforces 题面&#xff1a; 题意&#xff1a; 给定一个字符串&#xff0c;把这个字符串每个字符重复两遍后重新排序一定是一个回文串&#xff0c;问这个回文串是什么 思路&#xff1a; 题目是多种答案…

LVS-DR模式单网段和多网段案例实现

1 实验环境&#xff1a; 一台&#xff1a;客户端 eth0:仅主机 192.168.10.8/24 GW:192.168.10.18一台&#xff1a;ROUTER eth0 :NAT 192.168.100.18/24 eth1: 仅主机 192.168.10.18/24 启用 IP_FORWARD一台&#xff1a;LVS eth0:NAT:DIP:192.168.100.48/24 GW:192.168.100.18两…

进程与信号(三)

目录 一、前言 二、Signals 1、Signal Handling&#xff08;ctrlc.c&#xff09; 2、Sending Signals &#xff08;1&#xff09;alarm.c &#xff08;2&#xff09;A Robust Signals Interface &#xff08;3&#xff09;ctrlc2.c 3、Signal Sets &#xff08;1&…

小学生python游戏编程arcade----单词对错检测及记录写入excel中

小学生python游戏编程arcade----单词对错检测及记录写入excel中前言单词对错检测及记录写入excel中1、excel读取修改1.1 excel读取1.2 修改用到的库1.3 获取Excel表格名称的三种方式1.4 excel格式问题excel文件保存2.1 保存函数2.2 实验2.3 游戏中调用修改2.4 升级时保存字典内…

SuperMap GIS管线数据优化

一、优化目的 城市管网数据错综复杂&#xff0c;未经优化处理的数据在加载过程中可能会出现显示效果差&#xff0c;浏览效率低的情况&#xff0c;特别是在浏览器端&#xff0c;受文件请求量&#xff0c;网络带宽、硬件性能等方面的影响&#xff0c;未经优化的管线数据显示可能不…

5个高清图片素材网站,无水印,免费商用。

网上找的图片素材清晰度不够&#xff0c;版权不明确怎么办。看看这几个可商用图片素材网站&#xff0c;解决你的所有图片需求&#xff0c;高清无水印、下载无限制、免费可商用&#xff0c;赶紧马住&#xff01; 1、菜鸟图库 https://www.sucai999.com/pic.html?vNTYxMjky 网站…

【学习笔记54】运动函数的分析

一、运动函数的基本实现 运动函数是我们自己封装的一个函数。作用是将css样式的改变不是一次性完成&#xff0c;是逐步完成执行效果&#xff0c;看上去像是动画/运动完成的css样式改变。实际项目中框架等都有自己的运动函数我们目前封装一个简单的兼容多属性的运动函数。 1、HT…