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中实现居中显示可以通过不同的属性来实现,取决于你是要水平居中还是垂直居中,或者两者都要。以下是一些常用的居中方法: 1.水平居中 - 行内元素或文本 .center-text {text-align: center; } 2.水平居中 - 块级元素 .center-block {mar…...
js判断一个任意值为空包括数组和对象
在JavaScript中,判断一个变量是否为空可以考虑以下几种情况: 如果变量可能是null或undefined,可以直接判断。 对于数组,如果想要判断数组为空(长度为0),可以检查其length属性。 对于对象&…...
EmguCV学习笔记 VB.Net和C# 下的OpenCv开发
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 笔者的博客网址:https://blog.csdn.net/uruseibest 本教程将分为VB.Net和C#两个版本分别进行发布。 教程VB.net版本请…...
“TCP粘包”不是TCP的问题!
前言 写RPC用了Netty。涉及到粘包拆包问题。想复习一下。发现网上博客多是概念模糊不清。没有触及本质或者没有讲清楚。 遂决定自己写一篇 “TCP粘包”是谁的问题? 首先我们要明确TCP是面向字节流的协议。也就是说我们在应用层想使用TCP来传输数据时,…...
Electron项目依赖管理:最佳实践与常见错误
问题一 问题描述: 输入命令 pnpm add electron 后, electron 包在执行 postinstall 脚本时,尝试从网络上下载 Electron 二进制文件,但由于网络问题(如连接超时或代理设置问题),导致下载失败。 λ pnpm a…...
华为数通路由交换HCIP/HCNP
2017-2022年软考高级网络规划设计师真题解析视频!软考复习一定要多做历年真题! 2022年软考网络规划设计师真题解析_哔哩哔哩_bilibili 2024年5月软考网络工程师真题解析合集,考后估分版【综合知识案例分析】 2024年5月软考网络工程师真题解…...
搜索面试题
1、目前怎么构建样本的?如果排序中第5个被点了,前面的作为负样本,后面的不要怎么样;为什么不好,为什么好。 点击作为负样本,曝光未点击作为负样本; 可以这样理解。您提到的排序中第5个被点的对…...
WPF学习(8) --Windows API函数的使用
一、API函数的介绍 1.FindWindow函数 [DllImport("user32.dll", CharSet CharSet.Auto)]public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 功能: FindWindow函数用于根据窗口的类名和窗口名称查找窗口的句柄(IntPtr…...
Linux系统-用户账号文件
文章目录 文件一(passwd) 文件二(shadow) 加密密码部分 举例理解 文件三(gshadow) 文件四(group) 文件五(skel) 文件六(login.defs&#…...
docker配置国内镜像加速
docker配置国内镜像加速 由于国内使用docker拉取镜像时,会经常出现连接超时的网络问题,所以配置Docker 加速来使用国内 的镜像加速服务,以提高拉取 Docker 镜像的速度。 1、备份docker配置文件 cp /etc/docker/daemon.json /etc/docker/da…...
C语言实现排序之堆排序算法
一、堆排序算法 基本思想 堆排序是一种比较有效的排序方法,其基本思想是: 构建最大堆:首先将待排序的数组构建成一个最大堆,即对于每个非叶子节点,它的值都大于或等于其子节点的值。排序:然后将堆顶元素…...
【STM32 Blue Pill编程】-外部中断配置及使用
外部中断配置及使用 文章目录 外部中断配置及使用1、中断介绍2、STM32中的中断3、硬件准备及接线4、GPIO配置5、代码实现在本文中,我们将介绍如何使用 STM32Cube IDE 中的 HAL 库配置和处理外部中断。 我们将通过一个带有按钮和 LED 的示例来演示这一点。 读完本文后,您将能够…...
MySQL 安装与配置教程:单机、主从复制与集群模式
目录 MySQL 简介MySQL 安装MySQL 基础配置MySQL 主从复制配置MySQL 集群配置总结 1. MySQL 简介 MySQL 是一个广泛使用的关系型数据库管理系统,具有高性能、高可靠性和易用性等特点。它支持多种部署模式,包括单机模式、主从复制模式(用于高…...
JavaEE 的相关知识点(一)
一、过滤器 过滤器(Filter)是一个用于对请求和响应进行预处理的组件。过滤器可以在 Java Servlet 规范中使用,通常用于执行一些通用的任务 1、过滤器的作用 过滤器是一种javaEE规范中定义的一种技术,可以让请求达到目标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的信息 在网络编程中,UDP(用户数据报协议)是一种常用的传输协议。与TCP不同,UDP是无连接的,并且不保证数据包的顺序、完整性及交付。尽管如此,UDP因其较低的延迟和开销而被广泛应…...
微服务设计原则——高性能:批量
能批量就不要并发。 如果调用方需要调用我们接口多次才能进行一个完整的操作,那么这个接口设计就可能有问题。 比如获取数据的接口,如果仅仅提供getData(int id)接口,那么使用方如果要一次性获取 20 个数据,它就需要循环遍历调用…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...
