当前位置: 首页 > news >正文

Fragment学习笔记

静态加载

    <fragment android:name="com.example.serviceapplication.fragment.TestFragment"android:layout_width="match_parent"android:layout_height="wrap_content"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/send_msg_btn"android:id="@+id/fragement1" />

静态加载直接注册在布局的xml文件里。需要注意,要指定frament的类型<android:name>和id<android:id>。

动态加载

动态加载的实现方式通常是,先在xml文件里静态注册一个空的view,再将这个空的view替换成fragment实例。

先搞个壳:

    <FrameLayoutandroid:id="@+id/fragment_container"android:layout_width="match_parent"android:layout_height="wrap_content"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/change_btn"/>

用java代码动态替换:

    private void replaceFragment(Fragment fragment) {FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction transaction = fragmentManager.beginTransaction();transaction.replace(R.id.fragment_container, fragment);transaction.commit();}

生命周期

fragment的生命周期与activity类似,但是fragment必须依附于activity存在,因此fragment必须额外能够判断自身与activity的关系,所以会有onAttach()与onDetach()

onAttach(): 当 Fragment 与 Activity 关联时调用。
onCreate(): 当 Fragment 创建时调用。
onCreateView(): 创建 Fragment 的视图层次结构时调用。
onActivityCreated(): 当与 Fragment 相关联的 Activity 完成 onCreate() 方法后调用。
onStart(): 当 Fragment 可见时调用。
onResume(): 当 Fragment 可交互时调用。
onPause(): 当 Fragment 失去焦点但仍可见时调用。
onStop(): 当 Fragment 不再可见时调用。
onDestroyView(): 当 Fragment 的视图层次结构被销毁时调用。
onDestroy(): 当 Fragment 被销毁时调用。
onDetach(): 当 Fragment 与 Activity 解除关联时调用。

Fragment通信

fragment与frament通信:

同一个activity里的frament之间通信很简单,因为他们可以互相持有。

能够互相持有的原因是,frament里可以通过getActivity()获取当前所在的activity,并进一步获取到该activity里面的其他frament。包括activtiy里其他暴露出的组件,都可以进行通信操作。

activity与frament通信:

安卓系统提供了一个机制,在创建frament的时候可以给它传递一个bundle,bundle里面存放数据即可。

activity里创建frament并传递数据bundle:

    private void initView() {mChangeFragmentBtn = this.findViewById(R.id.change_btn);mChangeFragmentBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Bundle bundle = new Bundle();bundle.putString("msg", "fragment1");BlankFragment blankFragment = new BlankFragment();// 给fragment传递参数blankFragment.setArguments(bundle);replaceFragment(blankFragment);}});}

在fragment里面读取:

    @Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Bundle bundle = this.getArguments();if (bundle != null) {Toast.makeText(getContext(), bundle.getString("msg"), Toast.LENGTH_SHORT).show();}}

由于frament一定被activity持有,所以activtiy可以通过注册listener的方式来获取frament的回调。

实例

可以将fragment和viewpager结合,做一个类似于微信主页的activity。

MainActivity:

package com.example.fragmentapplication;import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.viewpager2.widget.ViewPager2;import android.os.Bundle;
import android.view.View;
import android.widget.Button;import com.example.fragmentapplication.fragment.BlankFragment;
import com.example.fragmentapplication.fragmentviewpager.FragmentViewPagerAdapter;import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {ViewPager2 mViewPager;View tab1, tab2, tab3, tab4;View currentTab;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initTabView();}private void initTabView() {tab1 = this.findViewById(R.id.bottom_tab_chat);tab1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mViewPager.setCurrentItem(0);}});tab2 = this.findViewById(R.id.bottom_tab_game);tab2.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mViewPager.setCurrentItem(1);}});tab3 = this.findViewById(R.id.bottom_tab_social);tab3.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mViewPager.setCurrentItem(2);}});tab4 = this.findViewById(R.id.bottom_tab_user);tab4.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mViewPager.setCurrentItem(3);}});currentTab = tab1;currentTab.setSelected(true);}private void initView() {mViewPager = this.findViewById(R.id.main_viewpager);List<Fragment> fragmentList = new ArrayList<>();fragmentList.add(new BlankFragment());fragmentList.add(new BlankFragment());fragmentList.add(new BlankFragment());fragmentList.add(new BlankFragment());FragmentViewPagerAdapter pagerAdapter = new FragmentViewPagerAdapter(getSupportFragmentManager(), getLifecycle(), fragmentList);mViewPager.setAdapter(pagerAdapter);mViewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {@Overridepublic void onPageSelected(int position) {super.onPageSelected(position);setBottomTabSelected(position);}});}private void setBottomTabSelected(int position) {currentTab.setSelected(false);switch (position) {case 0:tab1.setSelected(true);currentTab = tab1;break;case 1:tab2.setSelected(true);currentTab = tab2;break;case 2:tab3.setSelected(true);currentTab = tab3;break;case 3:tab4.setSelected(true);currentTab = tab4;break;}}}

 

FragmentViewPagerAdapter:
package com.example.fragmentapplication.fragmentviewpager;import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.lifecycle.Lifecycle;
import androidx.viewpager2.adapter.FragmentStateAdapter;import java.util.ArrayList;
import java.util.List;public class FragmentViewPagerAdapter extends FragmentStateAdapter {List<Fragment> mFragmentList = new ArrayList<>();public FragmentViewPagerAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle, List<Fragment> fragments) {super(fragmentManager, lifecycle);mFragmentList = fragments;}@NonNull@Overridepublic Fragment createFragment(int position) {return mFragmentList.get(position);}@Overridepublic int getItemCount() {return mFragmentList.size();}
}

底部导航:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="55dp"android:background="@color/gray"><LinearLayoutandroid:id="@+id/bottom_tab_chat"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:layout_gravity="center"android:gravity="center"android:orientation="vertical"><ImageViewandroid:id="@+id/tab_image_chat"android:layout_width="30dp"android:layout_height="30dp"android:background="@color/black"/><TextViewandroid:id="@+id/tab_text_chat"android:layout_width="30dp"android:layout_height="wrap_content"android:text="聊天"/></LinearLayout><LinearLayoutandroid:id="@+id/bottom_tab_game"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:layout_gravity="center"android:gravity="center"android:orientation="vertical"><ImageViewandroid:id="@+id/tab_image_game"android:layout_width="30dp"android:layout_height="30dp"android:background="@color/black"/><TextViewandroid:id="@+id/tab_text_game"android:layout_width="30dp"android:layout_height="wrap_content"android:text="游戏"/></LinearLayout><LinearLayoutandroid:id="@+id/bottom_tab_social"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:layout_gravity="center"android:gravity="center"android:orientation="vertical"><ImageViewandroid:id="@+id/tab_image_social"android:layout_width="30dp"android:layout_height="30dp"android:background="@color/black"/><TextViewandroid:id="@+id/tab_text_socail"android:layout_width="30dp"android:layout_height="wrap_content"android:text="社区"/></LinearLayout><LinearLayoutandroid:id="@+id/bottom_tab_user"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:layout_gravity="center"android:gravity="center"android:orientation="vertical"><ImageViewandroid:id="@+id/tab_image_user"android:layout_width="30dp"android:layout_height="30dp"android:background="@color/black"/><TextViewandroid:id="@+id/tab_text_user"android:layout_width="30dp"android:layout_height="wrap_content"android:text="个人"/></LinearLayout></LinearLayout>

主布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"android:orientation="vertical"tools:context=".MainActivity"><androidx.viewpager2.widget.ViewPager2android:id="@+id/main_viewpager"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1" /><include layout="@layout/bottom_layout"/></LinearLayout>

相关文章:

Fragment学习笔记

静态加载 <fragment android:name"com.example.serviceapplication.fragment.TestFragment"android:layout_width"match_parent"android:layout_height"wrap_content"app:layout_constraintStart_toStartOf"parent"app:layout_cons…...

NGINX 基础参数与功能

章节 1 NGINX 的源码安装 2 NGINX 核心配置详解 3 NGINX 之 location 匹配优先级 4 NGINX 基础参数与功能 目录 1 实现 Nginx 账户认证功能 1.1 创建htpasswd 认证文件 1.2 创建数据目录 1.3 指定认证文件路径 1.4 测试效果 2 定义重定向错误日志 2.1 指定错误日志访问路…...

css设置元素居中显示

CSS中实现居中显示可以通过不同的属性来实现&#xff0c;取决于你是要水平居中还是垂直居中&#xff0c;或者两者都要。以下是一些常用的居中方法&#xff1a; 1.水平居中 - 行内元素或文本 .center-text {text-align: center; } 2.水平居中 - 块级元素 .center-block {mar…...

js判断一个任意值为空包括数组和对象

在JavaScript中&#xff0c;判断一个变量是否为空可以考虑以下几种情况&#xff1a; 如果变量可能是null或undefined&#xff0c;可以直接判断。 对于数组&#xff0c;如果想要判断数组为空&#xff08;长度为0&#xff09;&#xff0c;可以检查其length属性。 对于对象&…...

EmguCV学习笔记 VB.Net和C# 下的OpenCv开发

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 笔者的博客网址&#xff1a;https://blog.csdn.net/uruseibest 本教程将分为VB.Net和C#两个版本分别进行发布。 教程VB.net版本请…...

“TCP粘包”不是TCP的问题!

前言 写RPC用了Netty。涉及到粘包拆包问题。想复习一下。发现网上博客多是概念模糊不清。没有触及本质或者没有讲清楚。 遂决定自己写一篇 “TCP粘包”是谁的问题&#xff1f; 首先我们要明确TCP是面向字节流的协议。也就是说我们在应用层想使用TCP来传输数据时&#xff0c;…...

Electron项目依赖管理:最佳实践与常见错误

问题一 问题描述: 输入命令 pnpm add electron 后&#xff0c; electron 包在执行 postinstall 脚本时&#xff0c;尝试从网络上下载 Electron 二进制文件&#xff0c;但由于网络问题&#xff08;如连接超时或代理设置问题&#xff09;&#xff0c;导致下载失败。 λ pnpm a…...

华为数通路由交换HCIP/HCNP

2017-2022年软考高级网络规划设计师真题解析视频&#xff01;软考复习一定要多做历年真题&#xff01; 2022年软考网络规划设计师真题解析_哔哩哔哩_bilibili 2024年5月软考网络工程师真题解析合集&#xff0c;考后估分版【综合知识案例分析】 2024年5月软考网络工程师真题解…...

搜索面试题

1、目前怎么构建样本的&#xff1f;如果排序中第5个被点了&#xff0c;前面的作为负样本&#xff0c;后面的不要怎么样&#xff1b;为什么不好&#xff0c;为什么好。 点击作为负样本&#xff0c;曝光未点击作为负样本&#xff1b; 可以这样理解。您提到的排序中第5个被点的对…...

WPF学习(8) --Windows API函数的使用

一、API函数的介绍 1.FindWindow函数 [DllImport("user32.dll", CharSet CharSet.Auto)]public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 功能: FindWindow函数用于根据窗口的类名和窗口名称查找窗口的句柄&#xff08;IntPtr…...

Linux系统-用户账号文件

文章目录 文件一&#xff08;passwd&#xff09; 文件二&#xff08;shadow&#xff09; 加密密码部分 举例理解 文件三&#xff08;gshadow&#xff09; 文件四&#xff08;group&#xff09; 文件五&#xff08;skel&#xff09; 文件六&#xff08;login.defs&#…...

docker配置国内镜像加速

docker配置国内镜像加速 由于国内使用docker拉取镜像时&#xff0c;会经常出现连接超时的网络问题&#xff0c;所以配置Docker 加速来使用国内 的镜像加速服务&#xff0c;以提高拉取 Docker 镜像的速度。 1、备份docker配置文件 cp /etc/docker/daemon.json /etc/docker/da…...

C语言实现排序之堆排序算法

一、堆排序算法 基本思想 堆排序是一种比较有效的排序方法&#xff0c;其基本思想是&#xff1a; 构建最大堆&#xff1a;首先将待排序的数组构建成一个最大堆&#xff0c;即对于每个非叶子节点&#xff0c;它的值都大于或等于其子节点的值。排序&#xff1a;然后将堆顶元素…...

【STM32 Blue Pill编程】-外部中断配置及使用

外部中断配置及使用 文章目录 外部中断配置及使用1、中断介绍2、STM32中的中断3、硬件准备及接线4、GPIO配置5、代码实现在本文中,我们将介绍如何使用 STM32Cube IDE 中的 HAL 库配置和处理外部中断。 我们将通过一个带有按钮和 LED 的示例来演示这一点。 读完本文后,您将能够…...

MySQL 安装与配置教程:单机、主从复制与集群模式

目录 MySQL 简介MySQL 安装MySQL 基础配置MySQL 主从复制配置MySQL 集群配置总结 1. MySQL 简介 MySQL 是一个广泛使用的关系型数据库管理系统&#xff0c;具有高性能、高可靠性和易用性等特点。它支持多种部署模式&#xff0c;包括单机模式、主从复制模式&#xff08;用于高…...

JavaEE 的相关知识点(一)

一、过滤器 过滤器&#xff08;Filter&#xff09;是一个用于对请求和响应进行预处理的组件。过滤器可以在 Java Servlet 规范中使用&#xff0c;通常用于执行一些通用的任务 1、过滤器的作用 过滤器是一种javaEE规范中定义的一种技术&#xff0c;可以让请求达到目标servlet之…...

使用Python实现深度学习模型:智能医疗影像识别与诊断

介绍 智能医疗影像识别与诊断是现代医疗技术的重要应用,通过深度学习模型,可以自动分析和识别医疗影像,提高诊断的准确性和效率。本文将介绍如何使用Python和深度学习技术来实现智能医疗影像识别与诊断。 环境准备 首先,我们需要安装一些必要的Python库: pip install …...

24.给定一个链表,实现一个算法交换每两个相邻节点并返回其头部。要求不能修改列表节点中的值,只能更改节点本身。

24. Swap Nodes in Pairs 题目 给定一个链表,交换每两个相邻节点并返回其头部。要求不能修改列表节点中的值,只能更改节点本身。 Example: Given 1->2->3->4, you should return the list as 2->1->4->3....

Python 通过UDP传输超过64k的信息

Python 通过UDP传输超过64k的信息 在网络编程中&#xff0c;UDP&#xff08;用户数据报协议&#xff09;是一种常用的传输协议。与TCP不同&#xff0c;UDP是无连接的&#xff0c;并且不保证数据包的顺序、完整性及交付。尽管如此&#xff0c;UDP因其较低的延迟和开销而被广泛应…...

微服务设计原则——高性能:批量

能批量就不要并发。 如果调用方需要调用我们接口多次才能进行一个完整的操作&#xff0c;那么这个接口设计就可能有问题。 比如获取数据的接口&#xff0c;如果仅仅提供getData(int id)接口&#xff0c;那么使用方如果要一次性获取 20 个数据&#xff0c;它就需要循环遍历调用…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…...