Viewpager2+Fragment+指示器

news2024/11/24 6:02:55

Viewpager2+Fragment+指示器

  • 效果展示:

  1. MainActivity.java
package com.huawei.myviewpager;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager2.widget.ViewPager2;

import android.os.Bundle;
import android.view.View;
import android.widget.LinearLayout;

import com.huawei.myviewpager.adapter.MyFragmentPagerAdapter;
import com.huawei.myviewpager.fragment.FirstFragment;
import com.huawei.myviewpager.fragment.SecondFragment;
import com.huawei.myviewpager.fragment.ThirdFragment;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private MyFragmentPagerAdapter mAdapter;

    private ViewPager2 mViewpager;
    private List<Fragment> mList;

    private LinearLayout mPointIndicator;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mList = new ArrayList<>();
        mList.add(new FirstFragment());
        mList.add(new SecondFragment());
        mList.add(new ThirdFragment());
        mAdapter = new MyFragmentPagerAdapter(this, mList);
        initView();

    }

    private void initView() {
        mViewpager = findViewById(R.id.vp2);
        mViewpager.setAdapter(mAdapter);
        mPointIndicator = findViewById(R.id.fragment_indicator);
        insertPoint();
        mViewpager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageSelected(int position) {
                int realPosition;
                if (position != 0) {
                    realPosition = position % 3;
                } else {
                    realPosition = 0;
                }
                setSelectPoint(realPosition);
            }
        });
    }

    private void insertPoint() {
        for (int i = 0; i < 3; i++) {
            View point = new View(MainActivity.this);
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(40, 40);
            layoutParams.topMargin = 20;
            if (i == 0) {
                point.setBackground(getResources().getDrawable(R.drawable.indicator_point_selected));
            } else {
                point.setBackground(getResources().getDrawable(R.drawable.indicator_point_unselected));
            }
            point.setLayoutParams(layoutParams);
            mPointIndicator.addView(point);
        }
    }

    private void setSelectPoint(int realPosition) {
        for (int i = 0; i < mPointIndicator.getChildCount(); i++) {
            View point = mPointIndicator.getChildAt(i);
            if (i == realPosition) {
                point.setBackgroundResource(R.drawable.indicator_point_selected);
            } else {
                point.setBackgroundResource(R.drawable.indicator_point_unselected);
            }
        }
    }
}
  1. 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">

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/vp2"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <LinearLayout
        android:id="@+id/fragment_indicator"
        android:layout_width="40dp"
        android:layout_height="100dp"
        android:layout_alignParentEnd="true"
        android:layout_marginEnd="32dp"
        android:layout_marginTop="80dp"
        android:gravity="center"
        android:orientation="vertical" />

</RelativeLayout>
  1. MyFragmentPagerAdapter
package com.huawei.myviewpager.adapter;

import java.util.List;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;

public class MyFragmentPagerAdapter extends FragmentStateAdapter {

    private List<Fragment> mList;

    public MyFragmentPagerAdapter(@NonNull FragmentActivity fragmentActivity, List<Fragment> list) {
        super(fragmentActivity);
        mList = list;
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        Fragment fragment = mList.get(position);
        return fragment;
    }

    @Override
    public int getItemCount() {
        return mList.size();
    }
}
  1. FirstFragment.java
public class FirstFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_first, container, false);
    }
}
  1. fragment_first.xml,三个fragment相同布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitXY"
        android:src="@drawable/img9" />
</RelativeLayout>
  1. indicator_point_selected.xml 指示器选中shape
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="250dp" />
    <solid android:color="#FF000000" />
    <stroke android:color="#FF000000" />
</shape>
  1. indicator_point_unselected.xml 指示器未选中shape
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="250dp" />
    <solid android:color="#FFFFFFFF" />
    <stroke
        android:width="1dp"
        android:color="#FF000000" />
</shape
://schemas.android.com/apk/res/android">
    <corners android:radius="250dp" />
    <solid android:color="#FFFFFFFF" />
    <stroke
        android:width="1dp"
        android:color="#FF000000" />
</shape

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

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

相关文章

Java之接口

作者简介&#xff1a; zoro-1&#xff0c;目前大一&#xff0c;正在学习Java&#xff0c;数据结构等 作者主页&#xff1a; zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; Java之接口 接口的概念语法规则接口特性接口使用案…

初出茅庐的小李博客之STM32CubeMx驱动WS2812B实现幻彩(超详)

STM32CubeMx驱动WS2812B实现幻彩&#xff08;超详&#xff09; 1.创建基于STM32F03C8T6工程 1.1配置时钟 选择外部高速时钟源HSE 1.2配置系统时钟树使其达到最大时钟72MHz&#xff08;最大系统时钟&#xff09; 由时钟树可以知道APB1上定时器时钟频率是72MHz,实验使用的硬件…

人脸老化预测(Python)

本次项目的文件 main.py主程序如下 导入必要的库和模块&#xff1a; 导入 TensorFlow 库以及自定义的 FaceAging 模块。导入操作系统库和参数解析库。 定义 str2bool 函数&#xff1a; 自定义函数用于将字符串转换为布尔值。 创建命令行参数解析器&#xff1a; 使用 argparse.A…

linux驱动学习3-外部中断

在做中断试验时&#xff0c;发现中断驱动总是insmod失败&#xff0c;之后定位到 gpio_request 失败&#xff0c;之后是想到使用的野火做好的系统&#xff0c;在uEnv.txt中会加载大量设备树插件&#xff0c;将key相关的设备树插件屏蔽即可。 linux中断API函数 中断号 每个中断…

【管理运筹学】第 5 章 | 整数规划 (3,隐枚举法计算步骤)

文章目录 引言四、0-1 整数规划4.2 0-1 整数规划的解法4.2.1 0-1 规划模型标准型4.2.2 隐枚举法计算步骤 写在最后 引言 经过前文&#xff0c;了解以及体会到 0-1 变量的特性后&#xff0c;我们来研究该如何去求解这类特殊的 0-1 整数规划模型。 四、0-1 整数规划 4.2 0-1 整…

【Maven教程】(二)安装配置篇:手把手教你安装及配置Maven环境~

Maven安装配置篇 1️⃣ 在 Windows 上安装 Maven1.1 下载及安装 Maven1.2 升级 Maven 2️⃣ 在基于UNIX 的系统上安装 Maven2.1 下载和安装2.2 升级 Maven2.3 安装目录分析2.4 设置 HTTP 代理 3️⃣ 在 IDE中安装Maven插件 1️⃣ 在 Windows 上安装 Maven 在安装 Maven 之前&a…

【面试专题】Java核心基础篇②

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;Java面试专题 目录 1.接口和抽象类有什么区别&#xff1f; 2.两个对象的 hashCode() 相同&#xff0c;则 equals()也一定为 true&#xff0c;对吗&#xff1f; 3.说一说hashCode()和equals()的…

一般文章让你了解mybatis,以及如今在Java开发的地位!

一.了解mybatis&#xff01; A.什么是mybatis&#xff1f; MyBatis是一个开源的持久层框架&#xff0c;它简化了在Java应用程序中使用关系型数据库的开发工作。MyBatis提供了将SQL语句和Java代码进行解耦的能力&#xff0c;使得应用程序可以通过简单的配置来访问数据库&#x…

【AI视频教程】只需5步,AI作出鸡你太美视频

1.视频效果 黄昏见证虔诚的信徒 2.准备工作 制作视频效果&#xff0c;需要准备下面3个条件&#xff1a; 准备stable diffusion的环境剪辑一段【鸡你太美】原版视频stable diffusion安装sd-webui-IS-NET-pro插件 2.1部署stable diffusion环境 部署步骤参考制作ikun图片的文章…

软件开发中常用数据结构介绍:C语言队列

工作之余来写写C语言相关知识&#xff0c;以免忘记。今天就来聊聊C语言实现循环队列&#xff0c;我是分享人M哥&#xff0c;目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问&#xff0c;可底下评论&#xff01; 如果觉得文章内容在工作学习中有帮助到你&…

基于springboot+vue的考研资讯平台(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

Python中Setup.py的作用是什么

Python中Setup.py的作用是什么 今天就跟大家聊聊有关Python中Setup.py的作用是什么&#xff0c;可能很多人都不太了解&#xff0c;为了让大家更加了解. 1. 为什么需要对项目分发打包? 平常我们习惯了使用 pip 来安装一些第三方模块&#xff0c;这个安装过程之所以简单&#…

高项4.项目管理核心技术.

第一部分 项目管理概论 价值驱动的项目管理知识体系: 十二项原则;生命周期四个阶段;五个过程组;十大PM知识领域;八大绩效域;外加价值交付系统; 自1987 年以来, PMBOK 一直是基于过程的项目管理标准的重要代表,项目管理从业者一 直坚持基于过程的项目管理方法。随着…

用python从零开始做一个最简单的小说爬虫带GUI界面(1/3)

目录 前言 三节博客内容概要 PyQt5的配置 设置软件的快捷启动方式 1. 用于设计界面的程序 2. 将Qt Designer设计出来的ui文件转化为py文件 3. 可以把py文件打包成可执行的exe文件 4. 将ico图片放在qrc文件中&#xff0c;再将qrc文件转换成py…

Axios跨域请求处理

问题背景&#xff1a; vue 项目用 axios 进行请求的时候&#xff0c;总是报“Access to XMLHttpRequest at ‘http://localhost:8889/api/login’ from origin ‘http://localhost:8080……’”的错误 实际上就是前后端分离的情况下&#xff0c;发生了跨域的问题 跨域定义&…

AWS SDK 3.x for .NET Framework 4.0 可行性测试

前言 为了应对日益增长的网络安全挑战, 越来越多的互联网厂商已经陆续开始或者已经彻底停止了对 SSL 3 / TLS 1.0 / TLS1.1 等上古加密算法的支持. 而对于一些同样拥有悠久历史的和 AWS 服务相关联的应用程序, 是否可以通过仅更新 SDK 版本的方式来适应新的环境. 本文将以 Win…

PyTorch模型性能分析与优化

动动发财的小手&#xff0c;点个赞吧&#xff01; 训练深度学习模型&#xff0c;尤其是大型模型&#xff0c;可能是一项昂贵的支出。我们可以使用的管理这些成本的主要方法之一是性能优化。性能优化是一个迭代过程&#xff0c;我们不断寻找提高应用程序性能的机会&#xff0c;然…

基于Java+SpringBoot+vue前后端分离在线动漫信息系统设计实现

基于JavaSpringBootvue前后端分离在线动漫信息系统设计实现&#xff08;程序源码毕业论文&#xff09; 大家好&#xff0c;今天给大家介绍基于JavaSpringBootvue前后端分离在线动漫信息系统设计与实现&#xff0c;本论文只截取部分文章重点&#xff0c;文章末尾附有本毕业设计完…

基于单片机串口控制直流电机调速

一、系统方案 (2)本设计采用STC89C5单片机作为主控器&#xff0c;串口控制直流电机调速&#xff0c;串口助手发送1-8&#xff0c;改变电机速度&#xff0c;数码管显示对应速度。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 TMOD0x21;//定…

Linux学习之ssh和scp

ls /etc/ssh可以看到这个目录下有一些文件&#xff0c;而/etc/ssh/ssh_config是客户端配置文件&#xff0c;/etc/ssh/sshd_config是服务端配置文件。 cat -n /etc/ssh/sshd_config | grep "Port "可以看一下sshd监听端口的配置信息&#xff0c;发现这个配置端口是22…