使用supportFragmentManager管理多个fragment切换

news2024/10/6 12:32:16

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 -->
    <FrameLayout
        android: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
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment_example, container, false);
        }
    }
    
    <!-- fragment_example.xml -->
    <LinearLayout
        xmlns: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 -->
        <TextView
            android: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 {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // 默认加载的 Fragment
            if (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 -->
    <FrameLayout
        android: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 fragment
            return inflater.inflate(R.layout.fragment_example, container, false)
        }
    }
    
    <!-- fragment_example.xml -->
    <LinearLayout
        xmlns: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 -->
        <TextView
            android: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)
    
            // 默认加载的 Fragment
            if (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 fragment
            return 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 -->
    <LinearLayout
        xmlns: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 -->
        <Button
            android: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)
    
            // 默认加载的 Fragment
            if (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: ExampleFragment
        private lateinit var anotherFragment: AnotherFragment
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            if (savedInstanceState == null) {
                // 初始化 Fragment 实例
                exampleFragment = ExampleFragment()
                anotherFragment = AnotherFragment()
                
                // 默认加载的 Fragment
                supportFragmentManager.beginTransaction()
                    .replace(R.id.fragment_container, exampleFragment)
                    .commit()
            } else {
                // 恢复已存在的 Fragment 实例
                exampleFragment = supportFragmentManager.findFragmentByTag("ExampleFragment") as ExampleFragment
                anotherFragment = 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 fragment
            return 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()
    
                // 默认加载的 Fragment
                switchFragment("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 fragment
            return 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 fragment
            return 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.mylibrary
    
    import android.os.Bundle
    import android.view.LayoutInflater
    import android.view.View
    import android.view.ViewGroup
    import androidx.fragment.app.Fragment
    
    class CustomFragment : Fragment() {
        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            // Inflate the layout for this fragment
            return inflater.inflate(R.layout.fragment_custom, container, false)
        }
    }
    
    <!-- mylibrary/src/main/res/layout/fragment_custom.xml -->
    <LinearLayout
        xmlns: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 -->
        <TextView
            android: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.CustomFragment
    
    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()
                fragmentMap["CustomFragment"] = CustomFragment()
    
                // 默认加载的 Fragment
                switchFragment("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 fragment
            return 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。这使得代码更加模块化和可复用。

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

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

相关文章

Android性能分析工具-Perfetto基本使用

文章目录 一、Perfetto介绍二、抓取方法2.1 手机端直接抓取2.1.1 打开系统跟踪2.1.2 开始录制 2.2 使用 adb 抓取2.3 通过 Perfetto 网页自定义抓取 三、trace分析方法3.1 打开trace文件3.2 查看方法 一、Perfetto介绍 Perfetto 是一个用于性能检测和跟踪分析的生产级开源堆栈。…

CSS 文本输入框右下角的尺寸控件(三斜线:-webkit-resizer)消除,以及如何配置其样式,添加 resize 让标签元素可进行拖拽放大。

前言&#xff1a;在日常的前端开发中&#xff0c;不管是原始的和 还在在各类组件库中的文本输入框中&#xff0c;元素内容的右下角总是有一个三斜线的样式&#xff0c;本文简单了解它是什么&#xff1f;如何去控制并修改样式&#xff1f; 一、它是&#xff1f; 这三个斜线其实…

python---OpenCv(二),背景分离方法较有意思

目录 边界矩形 旋转矩形(最小外接矩形): 计算轮廓 找4个点的坐标 把浮点型转为Int 画轮廓 边界矩形--&#xff08;最大外接矩形&#xff09; 转灰度 找轮廓 找顶点 画矩形 显示 背景分离方法&#xff08;这个很好玩&#xff0c;可以识别在动的物体&#xff09; 边…

如何提高项目风险的处理效率?5个重点

提高项目风险的处理效率&#xff0c;有助于迅速识别和应对风险&#xff0c;减少风险导致的延误&#xff0c;降低成本&#xff0c;提升项目质量&#xff0c;确保项目按时交付。如果项目风险处理效率较低&#xff0c;未能及时发现和处理风险&#xff0c;导致问题累积&#xff0c;…

文化财经wh6boll带macd多空转折点提示指标公式源码

文化财经wh6boll带macd多空转折点提示指标公式源码&#xff1a; DIFF:EMA(CLOSE,12) - EMA(CLOSE,26); DEA:EMA(DIFF,9); MACD:2*(DIFF-DEA); MID:MA(CLOSE,26);//求N个周期的收盘价均线&#xff0c;称为布林通道中轨 TMP2:STD(CLOSE,26);//求M个周期内的收盘价的标准差 …

【计算机网络体系结构】计算机网络体系结构实验-www服务器配置管理实验

一、实验内容 www服务器配置管理&#xff0c; wireshark数据包分析 二、实验目的 1. 了解WWW服务的体系结构与工作原理&#xff0c;掌握利用Microsoft的IIS实现WWW服务的基本配置&#xff0c;掌握WEB站点的管理 2. 利用Wireshark抓取http数据包进行分析。运行软件Wireshark…

ARM 240625

练习&#xff1a; 汇编实现1-100累加&#xff0c;结果保存在r0 .text 声明下面内容都属于文本段内容 .globl _start 声明 _start 是一个全局启用的标签_start: 封装 _start 标签&#xff0c;汇编的标签和C中函数类似mov r0,#0 mov 把0 搬运到 r0 寄存器mov r1,#1 mov 把1 …

postman汉化中文(Windows)

Postman 是一款专业的 API 开发工具&#xff0c;为开发者提供了创建、测试、调试和分享 HTTP 请求的便利性和灵活性。其主要功能包括请求构建与发送、自动化测试、团队协作与分享、实时监视与调试以及环境与变量管理。无论是个人开发者还是团队&#xff0c;Postman 都能有效地提…

Fragment与ViewModel(MVVM架构)

简介 在Android应用开发中&#xff0c;Fragment和ViewModel是两个非常重要的概念&#xff0c;它们分别属于架构组件库的一部分&#xff0c;旨在帮助开发者构建更加模块化、健壮且易维护的应用。 Fragment Fragment是Android系统提供的一种可重用的UI组件&#xff0c;它能够作为…

【第14章】探索新技术:如何自学SD3模型(找官方资料/精读/下载/安装/3款工作流/效果测试)ComfyUI基础入门教程

近期,也就是2024年6月12日,StabilityAI开源了最新的SD3模型的2B版本,而神奇的是,ComfyUI早在6月11号就已经适配了SD3!相比之下,SD WebUI 的更新速度却远远落后... 所以,如果想要尝试一些AI绘画领域的新技术,ComfyUI是一个非常值得投入时间学习的工具。 这节课,我们就…

Ascend基于自定义算子工程的算子开发

环境准备 见https://gitee.com/zaj1414904389/ascend-tutorial.git 工程创建 CANN软件包中提供了工程创建工具msopgen&#xff0c;开发者可以输入算子原型定义文件生成Ascend C算子开发工程 [{"op": "AddCustom","input_desc": [{"name…

2024全网最全面及最新且最为详细的网络安全技巧四 之 sql注入以及mysql绕过技巧 (2)———— 作者:LJS

目录 4.5 DNS记录类型介绍(A记录、MX记录、NS记录等&#xff0c;TXT&#xff0c;CNAME&#xff0c;PTR) 4.5.1 DNS 4.5.2 A记录 4.5.3NS记录 4.5.4 MX记录 4.5.5 CNAME记录 4.5.6 TXT记录 4.5.7 泛域名与泛解析 4.5.8域名绑定 4.5.9 域名转向 4.6 Mysql报错注入之floor报错详解…

基于Java影院管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f;感兴趣的可以先收藏起来&#xff0c;还…

若依框架自定义左侧导航栏图标,并变色

若依框架中&#xff0c;有时候设计图跟若依框架自带的图标不一样&#xff0c;需要替换掉&#xff0c;问题来了&#xff0c;怎么替换&#xff0c;并变色&#xff1f; 1、设计师给的图标的路径必须是合并的&#xff0c;非多个路径&#xff0c;这样我们下载下来的svg图才有只有一个…

msvcr110.dll丢失的解决方法,亲测有效的几种解决方法

最近&#xff0c;我在启动一个程序时&#xff0c;系统突然弹出一个错误提示&#xff0c;告诉我电脑缺失了一个名为msvcr110.dll的文件。这让我感到非常困惑&#xff0c;因为我之前从未遇到过这样的问题。经过一番搜索和尝试&#xff0c;我总结了5种靠谱的解决方法。下面分享给大…

平凉小果子,平凡中的惊艳味道

平凉美食小果子&#xff0c;这看似平凡的名字背后&#xff0c;藏着无数平凉人的美好回忆。它不仅仅是一种食物&#xff0c;更是一种情感的寄托&#xff0c;一种文化的传承。小果子的制作过程看似简单&#xff0c;实则蕴含着深厚的功夫。选用优质的面粉作为主要原料&#xff0c;…

vue3-openlayers 要素聚合(cluster)、icon聚合

本篇介绍一下使用vue3-openlayers 要素聚合&#xff08;cluster&#xff09;&#xff0c;icon聚合 1 需求 要素聚合&#xff08;cluster&#xff09;&#xff0c;icon聚合 2 分析 使用ol-source-cluster 4 实现 <template><ol-map:loadTilesWhileAnimating"…

Redis数据库(五):Redis数据库基本特性

这一节我们来介绍如何使用C语言的库来操作Redis数据库。 目录 一、hiredis的安装 1.1 下载源码 1.2 解压 1.3 进入hiredis路径下 1.4 利用makefile文件进行编译 二、接口介绍 三、C程序操作Redis代码 四、redis.conf配置文件详解 五、Redis的持久化 5.1 RDB &#x…

优思学院|精益生产3大特征、5个步骤、8大浪费、10大工具

前言 精益生产作为一种先进的生产管理理念&#xff0c;起源于丰田汽车公司的生产方式&#xff0c;其核心在于消除浪费、优化流程&#xff0c;以最少的投入获取最大的产出。本文将详细解析精益生产的三大特征、五个步骤、八大浪费和十大工具&#xff0c;帮助读者深入理解这一理…

【java计算机毕设】学生作业管理系统java MySQL ssm JSP maven项目源代码+文档

1项目功能 【java计算机毕设】学生作业管理系统java MySQL ssm JSP maven 项目设计源代码 文档 期末小组作业 2项目介绍 系统功能&#xff1a; 学生作业管理系统包括管理员、小管理员、教师、学生四种角色。 管理员功能包括个人中心模块用于修改个人信息和密码、管理员管理、学…