安卓开发--应用市场的界面制作(一)--viewpager+fragment实现可滑动的底部导航栏

2023-10-26

相关文章

前言

第一次写博客,对markdown的使用还不是很熟悉。。。。
刚刚学完fragment,真是感觉安卓的碎片化一下子可以让开发变得简单好多。学了这么几十年的安卓了(卧槽,暴露年龄了),以前都是在做一些小demo,学习新知识。所以这几天打算回顾一下以前学的东西,串起来做一个大项目——-应用市场的界面(项目?,嗯~~可以算是吧,哈哈)。闲话少说,开始干活。

今天先用viewpager+fragment做一个可以左右滑动的导航栏。先上图:
这里写图片描述

这个做起来其实也很简单,主布局中放一个 viewpager,一个Radiogroup就好了,然后把要放置的fragment用adapter关联起来,最后处理一下radiogroup的哦那checkedchangedlistener和viewpager的OnPageChangeListener 。一切ok了。

布局文件

  • layout_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android.support.v4.view.ViewPager
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/group"/>
    <RadioGroup
        android:id="@+id/group"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal"/>
</RelativeLayout>
  • radiobuttion.xml
<RadioButton xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/guide_background"
    android:button="@null"
    android:gravity="center"
    android:textSize="20sp" />
  • 4个fragment的布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:text="这是recommand!"/>
</RelativeLayout>

MainAcivity

public class MainActivity extends FragmentActivity {//这里一定不能继承Activity,因为后面用到的getSupportFragmentManager在Activity下无法获取。
    private ViewPager pager;
    private ArrayList<Fragment> fragments=new ArrayList<>();
    private Recommand recommand;
    private Apps apps;
    private Rank rank;
    private Manage manage;
    private RadioGroup group;
    private String[] guide_names;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);//全屏显示
        setContentView(R.layout.activity_main);
        Init_Views();//初始化view
        Manage_ViewPager();//管理viewpager
        Manage_RadioGroup();//管理radiogroup
    }
    private void Manage_RadioGroup(){
        for (int i=0;i<4;i++){
            RadioButton button=(RadioButton) LayoutInflater.from(this).inflate(R.layout.radiobutton,null);
            button.setId(i);
            button.setText(guide_names[i]);
            //这里的layoutparams中的第三个参数是layout_weight
            RadioGroup.LayoutParams params=new RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT,1);
            group.addView(button,params);
        }
        group.check(0);//选择第一个
        group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                pager.setCurrentItem(checkedId);//在这里通知viewpager
            }
        });
    }
    private void Manage_ViewPager(){
        pager.setOffscreenPageLimit(3);//(1)重要代码,后面会解释。
        pager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {//(2)重要代码
            @Override
            public android.support.v4.app.Fragment getItem(int position) {
                return fragments.get(position);
            }

            @Override
            public int getCount() {
                return fragments.size();
            }
        });
        pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                group.check(position);//在这里通知radiogroup
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }
    private void Init_Views(){
        pager=(ViewPager)findViewById(R.id.content);
        group=(RadioGroup)findViewById(R.id.group);
        recommand =new Recommand();apps=new Apps();rank=new Rank();manage=new Manage();
        fragments.add(recommand);fragments.add(apps);fragments.add(rank);fragments.add(manage);
        guide_names=getResources().getStringArray(R.array.guide_array);
    }
}

细节

  • 这里使用的FragmentPagerAdapter和FragmentStatePagerAdapter是在viewpager中绑定fragment时最常用的两个adapter。
  • FragmentPagerAdapter一般适用于页数较少的情况,他的特点是会保存当前界面,一般情况下是可以同时保存3个。当viewpager由第一页滑动到第二页时,会保存第一页,并预加载第三页。而当他滑动到第三页时,会将第一页销毁。
  • 而FragmentStatePagerAdapter则更适用于fragment很多的情况,他的特点是,当离开这一页时,就会销毁他,这样在fragment较多时可以减少内存占用。
  • 详情请参照这篇博文: ViewPager防止Fragment销毁以及取消Fragment的预加载
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安卓开发--应用市场的界面制作(一)--viewpager+fragment实现可滑动的底部导航栏 的相关文章

随机推荐

  • Android AnimationDrawable动画与APP启动引导页面

    Android AnimationDrawable动画与APP启动 加载引导页面 画面 AnimationDrawable是Android的Frame动画 可以简单的认为此AnimationDrawable能够将一系列资源图片加载成 电影
  • 大数据分析引擎之presto简介

    大数据分析引擎之presto简介 简介 presto是一个大数据分析引擎 不属于hadoop体系 他是基于内存的 他的集群模式是主从式的 他可以与任何的大数据存储引擎做集成 集成的时候使用它的Connectors集成 从这里我们可以他可以和
  • SpringBoot集成mybatis-plus生成实体类

    1 pom xml添加依赖 2 配置mybatis plus 在application yml中添加 配置数据库连接 3 在com dtest02 demo system config下添加MyBatisPlusConfig java 4
  • 踩坑:nacos利用startup.cmd -m standalone启动错误

    1 报错信息 PS D SpringCloud nacos nacos bin gt startup cmd m standalone startup cmd 无法将 startup cmd 项识别为 cmdlet 函数 脚本文件或可运行程
  • 线性代数 --- 最小二乘在直线拟合上的应用与Gram-Schmidt正交化(上)

    最小二乘在直线拟合上的应用 在前一篇最小二乘的文章中 线性代数 投影与最小二乘 下 多元方程组的最小二乘解与向量在多维子空间上的投影 松下J27的博客 CSDN博客多变量方程组的最小二乘 向量到多维子空间上的投影 https blog cs
  • 如何找数组中唯一重复的数?

    如何找数组中唯一重复的数 题目 方法一 不使用辅助空间的方法 思路 1 异或 同0异1 2 一组数连续异或 相当于消除重复的数 所以可以把1到1000这1000个数异或以后 和数组中的1001个元素异或 这样结果就是重复的元素 例 数组为
  • 热门面试题

    Transactional失效场景 没有将使用该注解的类交给Spring管理 也就是该对象不是bean对象 Transactional 应用在非 public 修饰的方法上 同一个类中方法之间的调用 导致 Transactional 失效
  • L - Sticky Situation

    L Sticky Situationhttps vjudge csgrandeur cn problem Kattis stickysituation 题意 给定一个 n 和 n 个数 看存不存在三个数可以构成三角形 include
  • hive中的EXPLODE和LATERAL VIEW

    行转列操作 0 函数说明 EXPLODE col 将 hive 一列中复杂的 array 或者 map 结构拆分成多行 LATERAL VIEW 用法 LATERAL VIEW udtf expression tableAlias AS c
  • 关于Rust

    Rust 文章目录 Rust 开发环境搭建 在线模式 离线模式 引入自定义第三方库 通用编程概念 Hello 注释 印屏 Display 变量 变量可变性 不可变变量与常量 变量冻结 延迟绑定 变量隐藏 数据类型 基本数据类型 类型别名 简
  • android 学习中遇到的知识点(杂)

    1 用xml 合成图片 ic launcher xml 作用 将两个图片组合成一个图片 一个背景图 一个icon
  • Oracle 实例名/服务名 请问SID和Service_Name有什么区别啊?

    可以简单的这样理解 一个公司比喻成一台服务器 数据库是这个公司中的一个部门 1 SID 一个数据库可以有多个实例 如RAC SID是用来标识这个数据库内部每个实例的名字 就好像一个部门里 每个人都有一个自己的名字 2 SERVICE NAM
  • spring boot 整合mybatis

    环境 eclipse Version 2019 06 4 12 0 jdk java version 1 8 0 144 maven Apache Maven 3 6 1 步骤 1 https spring io projects spri
  • 满月——有技巧的暴力

    题目描述 某一天你要去看满月 但是你发觉月亮只能看到一部分 现在你看到这些部分全部抽象成平面上的点 并且这些点只可能是在月亮的中心或者是月亮的边缘上 现在问你 月亮可能在什么位置上 就是哪个点可以做月亮的中心 输入 第一行一个整数N 表示有
  • 位运算符之异或

    按位运算符 异或 1 按位运算符 按位运算符对整数值的位进行操作 例如 左移运算符将位向左移 按位非运算符将所有的1变成0 所有的0变为1 C 共有6个这样的运算符 lt lt gt gt 今天我们来介绍其中一种 异或运算符 2 按位异或运
  • SpringBoot整合RabbitMQ

    该篇文章内容较多 包括有rabbitMq相关的一些简单理论介绍 provider消息推送实例 consumer消息消费实例 Direct Topic Fanout的使用 消息回调 手动确认等 但是关于rabbitMq的安装 就不介绍了 在安
  • ElasticSearch第七讲 ES查询速度为什么那么快

    介绍给大家一个开源SpringCloud项目 整合了大部分开源中间件 详情信息可以查看文档 spring cloud开源组件开发 另外自己以后博客所讲解的代码内容 都会我的Git上同步 GitHub同步 GIT地址 ES使用的数据结构是倒排
  • Git基础(常用命令)介绍

    版本控制是一种记录若干文件内容变化 以便将来查阅特定版本修订情况的系统 关于版本控制分为三种 本地版本控制系统 如rcs 集中化的版本控制系统 如CVS SVN 分布式版本控制系统 如Git Git基础要点 Git和其它版本控制系统的主要差
  • 【华为OD机试】乱序整数序列两数之和绝对值最小【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 给定一个随机的整数 可能存在正整数和负整数 数组 nums 请你在该数组中找出两个数 其和的绝对值 nums x nums y 为最小值 并返回这个两个数 按从小到大
  • 安卓开发--应用市场的界面制作(一)--viewpager+fragment实现可滑动的底部导航栏

    相关文章 前言 布局文件 MainAcivity 细节 相关文章 Android Fragment完全解析 关于碎片你所需知道的一切 这是一片很不错的博文 基本上看完就懂fragment是个什么情况了 ViewPager防止Fragment