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

使用supportFragmentManager管理多个fragment切换

android studio创建的项目就没有一个简单点的框架,生成的代码都是繁琐而复杂,并且不实用。

国内的页面一般都是TAB页面的比较多,老外更喜欢侧边菜单。

如果我们使用一个activity来创建程序,来用占位符管理多个fragment切换,这里水一篇最简单直接的做法。
源码:
https://download.csdn.net/download/robinfoxnan/89485371?spm=1001.2014.3001.5503

预览:https://img-blog.csdnimg.cn/direct/e38ca75c7a694b049366ef05da984ef6.jpeg

Description of image
## **1. Java**实现

在 Android 开发中,使用 FragmentManager 来管理多个 Fragment 页面是一个常见的做法。可以通过以下步骤在主页面的占位符上替换多个 Fragment

  1. 创建主 Activity 布局:在你的主 Activity 布局文件中,创建一个 FrameLayout 作为占位符,用于显示 Fragment

    <!-- activity_main.xml -->
    <FrameLayoutandroid:id="@+id/fragment_container"android:layout_width="match_parent"android:layout_height="match_parent" />
    
  2. 创建 Fragments:创建多个 Fragment,每个 Fragment 都有自己的布局和逻辑。

    // ExampleFragment.java
    public class ExampleFragment extends Fragment {@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {return inflater.inflate(R.layout.fragment_example, container, false);}
    }
    
    <!-- fragment_example.xml -->
    <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!-- Fragment content goes here --><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Example Fragment" />
    </LinearLayout>
    
  3. 在主 Activity 中管理 Fragments:在你的主 Activity 中使用 FragmentManager 来替换占位符中的 Fragment

    // MainActivity.java
    public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 默认加载的 Fragmentif (savedInstanceState == null) {getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ExampleFragment()).commit();}}// 用于切换 Fragment 的方法public void switchFragment(Fragment fragment) {getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).addToBackStack(null).commit();}
    }
    
  4. 切换 Fragment:在主 Activity 中调用 switchFragment 方法来切换不同的 Fragment

    // 切换到另一个 Fragment
    switchFragment(new AnotherFragment());
    

通过这种方式,你可以在主页面的占位符上动态替换多个 Fragment 页面。你可以根据需要在不同的事件(如按钮点击)中调用 switchFragment 方法来切换不同的 Fragment

2.kotlin实现

2.1 添加基础切换流程

下面是用 Kotlin 实现上述功能的步骤:

  1. 创建主 Activity 布局:在你的主 Activity 布局文件中,创建一个 FrameLayout 作为占位符,用于显示 Fragment

    <!-- activity_main.xml -->
    <FrameLayoutandroid:id="@+id/fragment_container"android:layout_width="match_parent"android:layout_height="match_parent" />
    
  2. 创建 Fragments:创建多个 Fragment,每个 Fragment 都有自己的布局和逻辑。

    // ExampleFragment.kt
    class ExampleFragment : Fragment() {override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_example, container, false)}
    }
    
    <!-- fragment_example.xml -->
    <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!-- Fragment content goes here --><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Example Fragment" />
    </LinearLayout>
    
  3. 在主 Activity 中管理 Fragments:在你的主 Activity 中使用 FragmentManager 来替换占位符中的 Fragment

    // MainActivity.kt
    class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 默认加载的 Fragmentif (savedInstanceState == null) {supportFragmentManager.beginTransaction().replace(R.id.fragment_container, ExampleFragment()).commit()}}// 用于切换 Fragment 的方法fun switchFragment(fragment: Fragment) {supportFragmentManager.beginTransaction().replace(R.id.fragment_container, fragment).addToBackStack(null).commit()}
    }
    
  4. 切换 Fragment:在主 Activity 中调用 switchFragment 方法来切换不同的 Fragment

    // 切换到另一个 Fragment
    switchFragment(AnotherFragment())
    

通过这种方式,可以在主页面的占位符上动态替换多个 Fragment 页面。你可以根据需要在不同的事件(如按钮点击)中调用 switchFragment 方法来切换不同的 Fragment

2.2 页面中获取主界面

AnotherFragment 中获取 MainActivity 的实例并调用 switchFragment 方法,你可以使用 Kotlin 的 activity 属性,它返回当前 Fragment 所附着的 Activity 实例。你需要确保类型转换安全,避免强制转换引起的异常。

下面是一个示例:

  1. 创建 AnotherFragment:在 AnotherFragment 中编写逻辑来获取 MainActivity 实例并调用 switchFragment 方法。

    // AnotherFragment.kt
    class AnotherFragment : Fragment() {override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_another, container, false)}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)// 假设你有一个按钮来触发 Fragment 切换val button: Button = view.findViewById(R.id.switch_fragment_button)button.setOnClickListener {(activity as? MainActivity)?.switchFragment(ExampleFragment())}}
    }
    
    <!-- fragment_another.xml -->
    <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!-- Fragment content goes here --><Buttonandroid:id="@+id/switch_fragment_button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Switch to Example Fragment" />
    </LinearLayout>
    
  2. 更新 MainActivity:确保 MainActivity 里有一个方法 switchFragment 可以被调用。

    // MainActivity.kt
    class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 默认加载的 Fragmentif (savedInstanceState == null) {supportFragmentManager.beginTransaction().replace(R.id.fragment_container, ExampleFragment()).commit()}}// 用于切换 Fragment 的方法fun switchFragment(fragment: Fragment) {supportFragmentManager.beginTransaction().replace(R.id.fragment_container, fragment).addToBackStack(null).commit()}
    }
    

通过这种方式,你可以在 AnotherFragment 中获取 MainActivity 的实例并调用 switchFragment 方法来切换 Fragment。这利用了 Kotlin 的安全类型转换 (as?) 来确保在类型转换失败时返回 null,而不是引发异常。

2.3 复用fragment

每次调用 switchFragment 方法时,都会创建一个新的 Fragment 实例并替换当前的 Fragment。如果你希望在切换 Fragment 时复用已有的 Fragment 实例,而不是每次都创建一个新的,可以在 MainActivity 中维护这些 Fragment 的实例。

下面是一个示例,展示如何在 MainActivity 中维护 Fragment 实例,并在切换时复用这些实例:

  1. MainActivity 中维护 Fragment 实例

    // MainActivity.kt
    class MainActivity : AppCompatActivity() {private lateinit var exampleFragment: ExampleFragmentprivate lateinit var anotherFragment: AnotherFragmentoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)if (savedInstanceState == null) {// 初始化 Fragment 实例exampleFragment = ExampleFragment()anotherFragment = AnotherFragment()// 默认加载的 FragmentsupportFragmentManager.beginTransaction().replace(R.id.fragment_container, exampleFragment).commit()} else {// 恢复已存在的 Fragment 实例exampleFragment = supportFragmentManager.findFragmentByTag("ExampleFragment") as ExampleFragmentanotherFragment = supportFragmentManager.findFragmentByTag("AnotherFragment") as AnotherFragment}}// 用于切换 Fragment 的方法fun switchFragment(fragment: Fragment, tag: String) {supportFragmentManager.beginTransaction().replace(R.id.fragment_container, fragment, tag).addToBackStack(null).commit()}
    }
    
  2. AnotherFragment 中调用 switchFragment 方法

    // AnotherFragment.kt
    class AnotherFragment : Fragment() {override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_another, container, false)}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)// 假设你有一个按钮来触发 Fragment 切换val button: Button = view.findViewById(R.id.switch_fragment_button)button.setOnClickListener {(activity as? MainActivity)?.switchFragment((activity as MainActivity).exampleFragment, "ExampleFragment")}}
    }
    

通过这种方式,你可以在 MainActivity 中维护 Fragment 的实例,并在切换时复用这些实例,而不是每次都创建一个新的 Fragment。在调用 switchFragment 方法时,通过传递 Fragment 实例和对应的标签(tag)来替换当前的 Fragment

2.4 map来管理多个fragment

可以使用一个 Map 来管理多个 Fragment 实例。这可以使得管理 Fragment 的实例更加灵活和高效。你可以在 MainActivity 中使用 Map 来存储 Fragment 实例,并在需要切换 Fragment 时从 Map 中获取相应的实例。

以下是一个示例,展示如何使用 Map 来管理多个 Fragment 实例:

  1. MainActivity 中定义一个 Map 来存储 Fragment 实例

    // MainActivity.kt
    class MainActivity : AppCompatActivity() {private val fragmentMap = mutableMapOf<String, Fragment>()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)if (savedInstanceState == null) {// 初始化 Fragment 实例并存储到 Map 中fragmentMap["ExampleFragment"] = ExampleFragment()fragmentMap["AnotherFragment"] = AnotherFragment()// 默认加载的 FragmentswitchFragment("ExampleFragment")}}// 用于切换 Fragment 的方法fun switchFragment(tag: String) {val fragment = fragmentMap[tag]fragment?.let {supportFragmentManager.beginTransaction().replace(R.id.fragment_container, it, tag).addToBackStack(null).commit()}}
    }
    
  2. AnotherFragment 中调用 switchFragment 方法

    // AnotherFragment.kt
    class AnotherFragment : Fragment() {override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_another, container, false)}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)// 假设你有一个按钮来触发 Fragment 切换val button: Button = view.findViewById(R.id.switch_fragment_button)button.setOnClickListener {(activity as? MainActivity)?.switchFragment("ExampleFragment")}}
    }
    
  3. ExampleFragment 中调用 switchFragment 方法(类似 AnotherFragment

    // ExampleFragment.kt
    class ExampleFragment : Fragment() {override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_example, container, false)}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)// 假设你有一个按钮来触发 Fragment 切换val button: Button = view.findViewById(R.id.switch_fragment_button)button.setOnClickListener {(activity as? MainActivity)?.switchFragment("AnotherFragment")}}
    }
    

通过这种方式,你可以使用一个 Map 来管理多个 Fragment 实例,并在需要时通过标签(tag)来切换 Fragment。这使得 Fragment 的管理更加灵活和高效。

2.5 使用库模块中的界面

当然可以!在 Android 项目中,你可以导入其他模块或库,并在你的应用中使用它们定义的 Fragment。以下是一个示例,展示如何导入一个模块并使用该模块中定义的 Fragment

假设你有一个名为 mylibrary 的模块,其中定义了一个 CustomFragment

  1. 在你的项目中导入模块

    首先,确保你的项目的 settings.gradle 文件中包含了该模块:

    include ':app', ':mylibrary'
    
  2. 添加模块依赖

    在你的应用模块的 build.gradle 文件中添加对 mylibrary 模块的依赖:

    dependencies {implementation project(':mylibrary')// 其他依赖项
    }
    
  3. 在你的模块中定义 Fragment

    mylibrary 模块中定义一个 CustomFragment

    // mylibrary/src/main/java/com/example/mylibrary/CustomFragment.kt
    package com.example.mylibraryimport android.os.Bundle
    import android.view.LayoutInflater
    import android.view.View
    import android.view.ViewGroup
    import androidx.fragment.app.Fragmentclass CustomFragment : Fragment() {override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_custom, container, false)}
    }
    
    <!-- mylibrary/src/main/res/layout/fragment_custom.xml -->
    <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!-- Fragment content goes here --><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Custom Fragment" />
    </LinearLayout>
    
  4. 在主应用中使用 CustomFragment

    现在你可以在你的主应用中使用 mylibrary 模块中定义的 CustomFragment

    // MainActivity.kt
    import android.os.Bundle
    import androidx.appcompat.app.AppCompatActivity
    import androidx.fragment.app.Fragment
    import com.example.mylibrary.CustomFragmentclass MainActivity : AppCompatActivity() {private val fragmentMap = mutableMapOf<String, Fragment>()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)if (savedInstanceState == null) {// 初始化 Fragment 实例并存储到 Map 中fragmentMap["ExampleFragment"] = ExampleFragment()fragmentMap["AnotherFragment"] = AnotherFragment()fragmentMap["CustomFragment"] = CustomFragment()// 默认加载的 FragmentswitchFragment("ExampleFragment")}}// 用于切换 Fragment 的方法fun switchFragment(tag: String) {val fragment = fragmentMap[tag]fragment?.let {supportFragmentManager.beginTransaction().replace(R.id.fragment_container, it, tag).addToBackStack(null).commit()}}
    }
    
  5. AnotherFragment 中调用 switchFragment 方法

    // AnotherFragment.kt
    class AnotherFragment : Fragment() {override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_another, container, false)}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)// 假设你有一个按钮来触发 Fragment 切换val button: Button = view.findViewById(R.id.switch_fragment_button)button.setOnClickListener {(activity as? MainActivity)?.switchFragment("CustomFragment")}}
    }
    

通过这种方式,你可以导入一个模块,并在主应用中使用该模块中定义的 Fragment。这使得代码更加模块化和可复用。

相关文章:

使用supportFragmentManager管理多个fragment切换

android studio创建的项目就没有一个简单点的框架&#xff0c;生成的代码都是繁琐而复杂&#xff0c;并且不实用。 国内的页面一般都是TAB页面的比较多&#xff0c;老外更喜欢侧边菜单。 如果我们使用一个activity来创建程序&#xff0c;来用占位符管理多个fragment切换&…...

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(六)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…...

独立开发者系列(17)——MYSQL的常见异常整理

虽然安装MYSQL到本地很简单&#xff0c;但是数据库报错还是经常出现&#xff0c;这个时候&#xff0c;需要我们进行逐步检查与修复。作为我们最常用的开发软件&#xff0c;无论切换php/go/python/node/java&#xff0c;数据库的身影都少不了&#xff0c;对于我们储存数据而言&a…...

【ajax实战02】数据管理网站—验证码登录

一&#xff1a;数据提交&#xff08;提交手机验证码&#xff09; 核心思路整理 利用form-serialize插件&#xff0c;收集对象形式的表单数据后&#xff0c;一并提交给服务器。后得到返回值&#xff0c;进一步操作 基地址&#xff1a; axios.defaults.baseURL http://geek.…...

人工智能在反无人机中的应用介绍

人工智能技术在无人机的发展中扮演着至关重要的角色&#xff0c;这一作用在反无人机技术领域同样显著。随着无人机技术的发展&#xff0c;飞行器具备了微小尺寸、高速机动性&#xff0c;以及可能采用的隐蔽或低空飞行轨迹等特性。这些特性使得传统的人工监视和控制手段面临着重…...

【力扣 - 每日一题】3115. 质数的最大距离(一次遍历、头尾遍历、空间换时间、埃式筛、欧拉筛、打表)Golang实现

原题链接 题目描述 给你一个整数数组 nums。 返回两个&#xff08;不一定不同的&#xff09;质数在 nums 中 下标 的 最大距离。 示例 1&#xff1a; 输入&#xff1a; nums [4,2,9,5,3] 输出&#xff1a; 3 解释&#xff1a; nums[1]、nums[3] 和 nums[4] 是质数。因此答…...

【Gin】项目搭建 一

环境准备 首先确保自己电脑安装了Golang 开始项目 1、初始化项目 mkdir gin-hello; # 创建文件夹 cd gin-hello; # 需要到刚创建的文件夹里操作 go mod init goserver; # 初始化项目&#xff0c;项目名称&#xff1a;goserver go get -u github.com/gin-gonic/gin; # 下载…...

C++ 和C#的差别

首先把眼睛瞪大&#xff0c;然后憋住一口气&#xff0c;读下去&#xff1a; 1、CPP 就是C plus plus的缩写&#xff0c;中国大陆的程序员圈子中通常被读做"C加加"&#xff0c;而西方的程序员通常读做"C plus plus"&#xff0c;它是一种使用非常广泛的计算…...

Vue2组件传值(通信)的方式

目录 1.父传后代 ( 后代拿到了父的数据 )1. 父组件引入子组件&#xff0c;绑定数据2. 子组件直接使用父组件的数据3. 依赖注入(使用 provide/inject API)1.在祖先组件中使用 provide2.在后代组件中使用 inject 2.后代传父 &#xff08;父拿到了后代的数据&#xff09;1. 子组件…...

【数据结构 - 时间复杂度和空间复杂度】

文章目录 <center>时间复杂度和空间复杂度算法的复杂度时间复杂度大O的渐进表示法常见时间复杂度计算举例 空间复杂度实例 时间复杂度和空间复杂度 算法的复杂度 算法在编写成可执行程序后&#xff0c;运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏&…...

telegram支付

今天开始接入telegram支付,参考教程这个是telegram的官方说明,详细介绍了机器人支付API。 文章公开地址 新建机器人 因为支付是一个单独的系统,所以在做支付的时候单独创建了一个bot,没有用之前的bot了,特意这样将其分开。创建bot的方法和之前不变,这里不过多介绍。 获…...

elasticsearch-6.8.23的集群搭建过程

三个节点的 ElasticSearch 集群搭建步骤 准备三台机器&#xff1a;28.104.87.98、28.104.87.100、28.104.87.101 和 ElasticSearch 的安装包 elasticsearch-6.8.23.tar.gz ----------------------------- 28.104.87.98&#xff0c;使用 root 用户操作 ----------------------…...

javascript输出语法

javascript输出有三种方式 一种是弹窗输出&#xff0c;就是网页弹出一个对话框&#xff0c;弹出输出内容 语法是aler(内容) 示例代码如下 <body> <script> alert(你好); </script> </body> 这段代码运行后网页会出现一个对话框&#xff0c;弹出你…...

仓库管理系统26--权限设置

原创不易&#xff0c;打字不易&#xff0c;截图不易&#xff0c;多多点赞&#xff0c;送人玫瑰&#xff0c;留有余香&#xff0c;财务自由明日实现 1、权限概述 在应用软件中&#xff0c;通常将软件的功能分为若干个子程序&#xff0c;通过主程序调用。那么&#xff0c;通过…...

d3dx9_43.dll丢失怎么解决?d3dx9_43.dll怎么安装详细教程

在使用计算机中&#xff0c;如果遇到d3dx9_43.dll丢失或许找不到d3dx9_43.dll无法运行打开软件怎么办&#xff1f;这个是非常常见问题&#xff0c;下面我详细介绍一下d3dx9_43.dll是什么文件与d3dx9_43.dll的各种问题以及d3dx9_43.dll丢失的多个解决方法&#xff01; 一、d3dx9…...

[C++] 退出清理函数解读(exit、_exit、abort、atexit)

说明&#xff1a;在C中&#xff0c;exit、_exit&#xff08;或_Exit&#xff09;、abort和atexit是用于控制程序退出和清理的标准库函数。下面是对这些函数的详细解读&#xff1a; exit 函数原型&#xff1a;void exit(int status);作用&#xff1a;exit函数用于正常退出程序…...

代码随想录(回溯)

组合&#xff08;Leetcode77&#xff09; 思路 用递归每次遍历从1-n得数&#xff0c;然后list来记录是不是组合到k个了&#xff0c;然后这个每次for循环的开始不能和上一个值的开始重复&#xff0c;所以设置个遍历开始索引startindex class Solution {static List<List<…...

编译原理1

NFA&DFA 在正规式的等价证明可以借助正规集&#xff0c;也可以通过有限自动机DFA来证明等价&#xff0c;以下例题是针对DFA证明正规式的等价&#xff0c;主要步骤是①NFA&#xff1b;②状态转换表&#xff1b; ③状态转换矩阵&#xff1b; ④化简DFA&#xff1b; 文法和语…...

【信息系统项目管理师知识点速记】组织通用管理:流程管理

23.2 流程管理 通过流程视角能够真正看清楚组织系统的本质与内在联系,理顺流程能够理顺整个组织系统。流程是组织运行体系的框架基础,流程框架的质量影响和决定了整个组织运行体系的质量。把流程作为组织运行体系的主线,配备满足流程运作需要的资源,并构建与流程框架相匹配…...

前端 JS 经典:箭头函数的意义

箭头函数是为了消除函数的二义性。 1. 二义性 函数的二义性指函数有不同的两种用法&#xff0c;就造成了二义性&#xff0c;函数的两种用法&#xff1a;1. 指令序列。2. 构造器 1.1 指令序列 就是调用函数&#xff0c;相当于将函数内部的代码再从头执行一次。 1.2 构造器 …...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

ZYNQ学习记录FPGA(二)Verilog语言

一、Verilog简介 1.1 HDL&#xff08;Hardware Description language&#xff09; 在解释HDL之前&#xff0c;先来了解一下数字系统设计的流程&#xff1a;逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端&#xff0c;在这个过程中就需要用到HDL&#xff0c;正文…...

【汇编逆向系列】六、函数调用包含多个参数之多个整型-参数压栈顺序,rcx,rdx,r8,r9寄存器

从本章节开始&#xff0c;进入到函数有多个参数的情况&#xff0c;前面几个章节中介绍了整型和浮点型使用了不同的寄存器在进行函数传参&#xff0c;ECX是整型的第一个参数的寄存器&#xff0c;那么多个参数的情况下函数如何传参&#xff0c;下面展开介绍参数为整型时候的几种情…...

生信服务器 | 做生信为什么推荐使用Linux服务器?

原文链接&#xff1a;生信服务器 | 做生信为什么推荐使用Linux服务器&#xff1f; 一、 做生信为什么推荐使用服务器&#xff1f; 大家好&#xff0c;我是小杜。在做生信分析的同学&#xff0c;或是将接触学习生信分析的同学&#xff0c;<font style"color:rgb(53, 1…...