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 个数据,它就需要循环遍历调用…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...