【Android】碎片—动态添加、创建Fragment生命周期、通信

news2024/11/17 16:35:24

简单用法

在一个活动中添加两个碎片,并让这两个碎片平分活动空间

先新建一个左侧碎片布局和一个右侧碎片布局

左侧碎片

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Button"/>

</LinearLayout>

右侧碎片

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#00ff00">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textSize="20sp"
        android:text="这是文本"/>

</LinearLayout>

然后新建一个LeftFragment类和一个RightFragment类继承Fragment

package com.example.fragmentpractice;


import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

public class LeftFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.left_fragment, container, false);
        return view;
    }
}

package com.example.fragmentpractice;


import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

public class RightFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.right_fragment, container, false);
        return view;
    }
}

修改activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <fragment
        android:id="@+id/left_fragment"
        android:name="com.example.fragmentpractice.LeftFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>

    <fragment
        android:id="@+id/right_fragmgent"
        android:name="com.example.fragmentpractice.RightFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />

</LinearLayout>

使用了<fragment>添加碎片,需要用android:name属性来显示指明要添加的碎片类名

动态添加碎片

步骤

  1. 创建待添加的碎片实例
  2. 获取FragmentManager,在活动中可直接通过调用getSupportFragmentManager()方法得到
  3. 开启一个事务,通过调用beginTransaction()方法开启
  4. 向容器内添加或替换碎片,一般使用replace()方法实现,需要传入容器的id和待添加的碎片实例
  5. 提交事务,调用commit()方法来完成

代码

新建another_rigth_fragment

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:background="#ffff00"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textSize="20sp"
        android:text="这是另一个文本"/>

</LinearLayout>

创建AnotherRightFragment(和之前的操作一样)

package com.example.fragmentpractice;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

public class AnotherRightFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.another_right_fragment, container, false);
        return view;
    }
}

修改activity_main代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <fragment
        android:id="@+id/left_fragment"
        android:name="com.example.fragmentpractice.LeftFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>

    <FrameLayout
        android:id="@+id/right_layout"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1">

    </FrameLayout>

</LinearLayout>

修改MainActivity中的代码

package com.example.fragmentpractice;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;

import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

// 主活动类,继承自 AppCompatActivity,并实现 View.OnClickListener 接口
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    // 活动创建时调用
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 启用 Edge-to-Edge 模式
        EdgeToEdge.enable(this);
        // 设置活动的布局
        setContentView(R.layout.activity_main);
        // 找到布局中的按钮
        Button button = (Button) findViewById(R.id.button);
        // 为按钮设置点击监听器
        button.setOnClickListener(this);
        // 初始化时替换碎片
        replaceFragment(new RightFragment());
    }

    // 点击事件处理
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.button) {
            // 当按钮被点击时,替换碎片
            replaceFragment(new AnotherRightFragment());
        }
    }

    // 替换碎片的方法
    private void replaceFragment(Fragment fragment) {
        // 获取 FragmentManager
        FragmentManager fragmentManager = getSupportFragmentManager();
        // 开始一个新的事务
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        // 替换指定布局中的碎片
        transaction.replace(R.id.right_layout, fragment);
        // 提交事务
        transaction.commit();
    }
}

在碎片中模拟返回栈

在上面的例子中,点击按钮后返回会直接退出,如果想让他返回到上一个界面得模仿类似于栈的效果

只需要给MainActivity中的replaceFragment中添加:

transaction.replace(R.id.right_layout, fragment);

就行了。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(this);
        replaceFragment(new RightFragment());
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.button) {
            replaceFragment(new AnotherRightFragment());
        }
    }

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

碎片与活动之间的通信

FragmentManager提供了一个类似于findViewById()的方法,用于从布局文件中获取碎片的实例:

RightFragment rightFragment = (RightFragment) getSupportFragmentManager().findFragmentById(R.id.right_layout);

碎片的生命周期

onAttach()

  • 用法:当 Fragment 与 Activity 关联时调用。
  • 常用操作:初始化需要与 Activity 交互的组件或回调,确保 Fragment 与其宿主 Activity 之间的通信。

onCreate()

  • 用法:Fragment 被创建时调用。
  • 常用操作:初始化不与 UI 相关的资源,如创建或恢复数据、启动后台线程等。

onCreateView()

  • 用法:为 Fragment 创建视图层次结构时调用。
  • 常用操作:通过 LayoutInflater 填充 Fragment 的布局,初始化与视图相关的资源。

onActivityCreated()

  • 用法:确保与 Activity 相关的工作已经完成时调用。
  • 常用操作:在 Activity 的 onCreate() 方法执行完成后调用,可以在这里与 Activity 交互。

onStart()

  • 用法:Fragment 可见时调用。
  • 常用操作:注册任何需要在 Fragment 可见时工作的广播接收器或其他组件。

onResume()

  • 用法:Fragment 准备与用户交互时调用。
  • 常用操作:恢复暂停的 UI 更新或交互。

onPause()

  • 用法:Fragment 不再与用户交互时调用。
  • 常用操作:暂停与 UI 相关的操作,保存重要数据或状态。

onStop()

  • 用法:Fragment 不再可见时调用。
  • 常用操作:停止耗时的操作,如动画或播放视频,注销在 onStart() 中注册的广播接收器。

onDestroyView()

  • 用法:销毁 Fragment 的视图层次结构时调用。
  • 常用操作:清理与视图相关的资源,避免内存泄漏。

onDestroy()

  • 用法:销毁 Fragment 时调用。
  • 常用操作:清理所有资源,包括后台线程、数据和其他持有的资源。

onDetach()

  • 用法:Fragment 与 Activity 解除关联时调用。
  • 常用操作:清理与 Activity 相关的资源或回调,确保 Fragment 可以正确地与新的 Activity 关联。

image-20240722112404028

动态加载布局

使用限定符

修改activity_main文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <fragment
        android:id="@+id/left_fragment"
        android:name="com.example.fragmentpractice.LeftFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


</LinearLayout>

只留下一个左侧碎片

在res目录下新建layout-large文件夹,在这个文件夹下新建一个布局,也叫做activity_main

<?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="match_parent">

    <fragment
        android:id="@+id/left_fragment"
        android:name="com.example.fragmentpractice.LeftFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>
    <fragment
        android:id="@+id/right_fragment"
        android:name="com.example.fragmentpractice.RightFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="3"/>

</LinearLayout>

添加方法如下:

image-20240722121554656

使用最小宽度限定符

在res目录下新建layout-sw600dp文件夹,新建activity_main布局:

<?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="match_parent">

    <fragment
        android:id="@+id/left_fragment"
        android:name="com.example.fragmentpractice.LeftFragm25ent"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>

    <fragment
        android:id="@+id/right_fragment"
        android:name="com.example.fragmentpractice.RightFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="3"/>
</LinearLayout>

当程序运行在屏幕宽度大于等于600dp的设备上,会加载layout-sw600dp/activity_main布局,小于600dp加载默认的layout/activity_main布局

创建Fragment的生命周期

静态创建

  1. Fragment Constructor、onInflate、onCreate
  • Fragment Constructor
    • 当Fragment实例化时,调用其构造函数。此时可以进行一些初始设置,但不应涉及视图创建或其他可能耗时的操作。
  • onInflate
    • 当Fragment需要从布局文件中加载视图时调用。此时可以进行视图的初步配置。该方法在Fragment被附加到Activity之前调用。
  • onCreate
    • Fragment在创建时调用。此时可以进行非视图相关的初始化工作,比如初始化变量、设置配置等。
  1. Activity onCreate
  • 当Activity首次创建时调用。在这个方法中,通常会进行视图的初始化、设置事件监听器、初始化数据等操作。这是Activity生命周期中非常重要的一个方法。

动态创建

  1. Activity onCreate
  • 同静态创建中描述的一样,Activity在首次创建时调用onCreate方法。动态创建Fragment的步骤一般在这里进行,比如通过FragmentManager添加、替换Fragment。
  1. Fragment Constructor、onCreate
  • Fragment Constructor
    • 与静态创建类似,动态创建时Fragment实例化时也会调用构造函数进行初始设置。
  • onCreate
    • Fragment在创建时调用。动态创建时,可以在这里进行Fragment的初始化工作,比如从Activity传递过来的数据进行处理。与静态创建不同的是,这里通常会涉及到从Activity获取数据或传递数据给Activity。

工具

Fragment Transaction

Fragment Transaction是管理和操作Fragments的关键工具。

常用方法

  1. add():添加一个Fragment到Activity中。

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.add(R.id.fragment_container, new ExampleFragment());
    transaction.commit();
    
  2. replace():替换当前的Fragment。

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_container, new ExampleFragment());
    transaction.addToBackStack(null); // 可选,将事务添加到返回栈
    transaction.commit();
    
  3. remove():从Activity中移除一个Fragment。

    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
    if (fragment != null) {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.remove(fragment);
        transaction.commit();
    }
    
  4. hide():隐藏一个Fragment。

  5. show():显示一个隐藏的Fragment。

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.hide(existingFragment);
    transaction.show(newFragment);
    transaction.commit();
    
  6. attach():重新附加一个Fragment到UI。

  7. detach():从UI中分离一个Fragment。

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.detach(existingFragment);
    transaction.attach(existingFragment);
    transaction.commit();
    
  8. addToBackStack():将事务添加到返回栈中,以便用户可以按返回键撤销该事务。

  9. commit():提交事务。

// 获取FragmentManager
FragmentManager fragmentManager = getSupportFragmentManager();

// 开始一个事务
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

// 创建一个新的Fragment实例
Fragment fragment = new ExampleFragment();

// 添加Fragment到容器
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.addToBackStack(null); // 可选,将事务添加到返回栈
fragmentTransaction.commit(); // 提交事务

Fragment Manager

常用方法

  1. findFragmentById(int id):通过Fragment的容器视图ID来查找Fragment。

    FragmentManager fragmentManager = getSupportFragmentManager();
    Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);
    
    if (fragment != null) {
        // 找到的Fragment实例
    }
    
  2. findFragmentByTag(String tag):通过Fragment的标签(tag)来查找Fragment。

    FragmentManager fragmentManager = getSupportFragmentManager();
    Fragment fragment = fragmentManager.findFragmentById(R.id.fragment_container);
    
    if (fragment != null) {
        // 找到的Fragment实例
    }
    
  3. getFragments():获取当前FragmentManager中所有的Fragment(API Level 26及以上可用)。

    FragmentManager fragmentManager = getSupportFragmentManager();
    List<Fragment> fragments = fragmentManager.getFragments();
    
    for (Fragment fragment : fragments) {
        // 处理每个Fragment实例
    }
    

增删查替

Fragment的增删查替是通过FragmentManagerFragmentTransaction来实现的

增加

添加一个Fragment到Activity中

  1. 获取FragmentManager:

    FragmentManager fragmentManager = getSupportFragmentManager();
    
  2. 开启一个事务:

    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    
  3. 添加Fragment:

    MyFragment myFragment = new MyFragment();
    fragmentTransaction.add(R.id.fragment_container, myFragment);
    
  4. 提交事务:

    fragmentTransaction.commit();
    

删除

从Activity中移除一个Fragment

  1. 获取FragmentManager:

    FragmentManager fragmentManager = getSupportFragmentManager();
    
  2. 找到要移除的Fragment:

    MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.fragment_container);
    
  3. 开启一个事务:

    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    
  4. 移除Fragment:

    if (myFragment != null) {
        fragmentTransaction.remove(myFragment);
    }
    
  5. 提交事务:

    fragmentTransaction.commit();
    

查找

根据ID或标签查找Fragment

  1. 获取FragmentManager:

    FragmentManager fragmentManager = getSupportFragmentManager();
    
  2. 根据ID查找:

    MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.fragment_container);
    
  3. 根据标签查找:

    MyFragment myFragment = (MyFragment) fragmentManager.findFragmentByTag("MY_FRAGMENT_TAG");
    

替换

替换Activity中的一个Fragment

  1. 获取FragmentManager:

    FragmentManager fragmentManager = getSupportFragmentManager();
    
  2. 开启一个事务:

    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    
  3. 替换Fragment:

    MyNewFragment newFragment = new MyNewFragment();
    fragmentTransaction.replace(R.id.fragment_container, newFragment);
    
  4. 提交事务:

    fragmentTransaction.commit();
    

Fragment与Activity之间的通信

Activity向Fragment

  1. 在Activity中设置数据:

    使用Fragment的setArguments方法来传递数据。在创建Fragment实例时,可以通过Bundle将数据传递给Fragment。

// 在Activity中
Bundle bundle = new Bundle();
bundle.putString("key", "value");

MyFragment myFragment = new MyFragment();
myFragment.setArguments(bundle);

getSupportFragmentManager().beginTransaction()
    .add(R.id.fragment_container, myFragment)
    .commit();
  1. 在Fragment中接收数据:

    在Fragment的onCreate方法中获取传递过来的数据。

// 在Fragment中
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        String value = getArguments().getString("key");
        // 使用获取到的数据
    }
}

Fragment向Activity

  1. 定义一个接口:

    在Fragment中定义一个接口,Activity实现该接口来接收数据。

// 在Fragment中定义接口
public interface OnFragmentInteractionListener {
    void onFragmentInteraction(String data);
}

private OnFragmentInteractionListener mListener;

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    if (context instanceof OnFragmentInteractionListener) {
        mListener = (OnFragmentInteractionListener) context;
    } else {
        throw new RuntimeException(context.toString()
            + " must implement OnFragmentInteractionListener");
    }
}

// 使用接口传递数据
public void sendDataToActivity(String data) {
    if (mListener != null) {
        mListener.onFragmentInteraction(data);
    }
}
  1. 在Activity中实现接口:

    实现Fragment定义的接口,在接口方法中处理接收到的数据。

// 在Activity中实现接口
public class MyActivity extends AppCompatActivity implements MyFragment.OnFragmentInteractionListener {

    @Override
    public void onFragmentInteraction(String data) {
        // 处理从Fragment接收到的数据
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyFragment myFragment = new MyFragment();
        getSupportFragmentManager().beginTransaction()
            .add(R.id.fragment_container, myFragment)
            .commit();
    }
}

Fragment之间的数据传递

Fragment之间的通信可以通过它们共同的Activity来实现。一个Fragment将数据传递给Activity,然后Activity将数据传递给另一个Fragment。

1.Fragment A 向 Activity 传递数据

使用上面描述的Fragment向Activity传递数据的方法。

2.Activity 接收数据并传递给 Fragment B

在Activity中接收数据:

@Override
public void onFragmentInteraction(String data) {
    FragmentB fragmentB = (FragmentB) getSupportFragmentManager().findFragmentById(R.id.fragment_b_container);
    if (fragmentB != null) {
        fragmentB.updateData(data);
    }
}

在Fragment B中定义方法来接收数据:

// 在Fragment B中
public void updateData(String data) {
    // 更新Fragment B中的数据
}

已经到底啦!

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

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

相关文章

智慧工地视频汇聚管理平台:打造现代化工程管理的全新视界

一、方案背景 科技高速发展的今天&#xff0c;工地施工已发生翻天覆地的变化&#xff0c;传统工地管理模式很容易造成工地管理混乱、安全事故、数据延迟等问题&#xff0c;人力资源的不足也进一步加剧了监管不到位的局面&#xff0c;严重影响了施工进度质量和安全。 视频监控…

LLM及GPT知识点

工欲善其事必先利其器&#xff0c;在了解大语言模型和GPT之前先要了解基本概念。 LLM Large Language Model (LLM) 即大型语言模型&#xff0c;也叫大语言模型&#xff0c;是一种基于深度学习的自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;它能够学习自然语言的语…

【Django】django模板与前端技术(html模板)

文章目录 “python包html”还是“html包python”?1.新建模板2.模板语法3.views.py测试 “python包html”还是“html包python”? 在前端页面中html代码比python多得多&#xff0c;所以一定是html包python最优&#xff01;于是引出今天的模板。 大体分为三个步骤&#xff1a;…

【Python面试题收录】Python编程基础练习题②(数据类型+文件操作+时间操作)

本文所有代码打包在Gitee仓库中https://gitee.com/wx114/Python-Interview-Questions 一、数据类型 第一题 编写一个函数&#xff0c;实现&#xff1a;先去除左右空白符&#xff0c;自动检测输入的数据类型&#xff0c;如果是整数就转换成二进制形式并返回出结果&#xff1b…

什么是数据标注?

什么是数据标注&#xff1f; 数据标注是在原始数据上添加结构化信息的过程&#xff0c;这些信息通常以标签或元数据的形式存在&#xff0c;目的是让机器能够理解和“学习”数据的特征&#xff0c;从而提高算法的准确性和效率。 数据标注是机器学习和人工智能开发中不可或缺的一…

网络地址转换技术

一、实验日期与地址 1、实验日期&#xff1a;2024年xx月xx日 2、实验地址&#xff1a;xxx 二、实验目的 1、理解源NAT应用场景及原理&#xff1b; 2、掌握NAT Server的配置方法&#xff1b; 3、掌握NAT双出口的配置方法&#xff1b; 4、掌握域内NAT的配置方法。 三、实…

【C++】标准库类型vector

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 vector对象集合简介 vector对象集合常用接口(成员函数) &#x1f4cc;vector对象集合模板默认成员函数 &#x1f38f;vector对象集合模板构造函数 &#x1f38f;vector对象…

【vue3|第18期】Vue-Router路由的三种传参方式

日期:2024年7月17日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^ 1.01365 = 37.7834;0.99365 = 0.0255 1.02365 = 1377.408…

HarmonyOS入门-状态管理

View(UI)&#xff1a;UI渲染&#xff0c;指将build方法内的UI描述和Builder装饰的方法内的UI描述映射到界面。 State&#xff1a;状态&#xff0c;指驱动UI更新的数据。用户通过触发组件的事件方法&#xff0c;改变状态数据。状态数据的改变&#xff0c;引起UI的重新渲染。 装…

<PLC><HMI><汇川>在汇川HMI画面中,如何为UI设置全局样式?

前言 汇川的HMI软件是使用了Qt来编写的,因此在汇川的HMI程序编写过程,是支持使用qt的样式来自定义部件样式的,即qss格式。 概述 汇川的软件本身提供三个系统的style样式,我们可以直接使用,但是,如果系统提供的样式不符合你的需求,那么你可以对其进行修改,或者自己新建…

Pytorch使用教学4-张量的索引

1 张量的符号索引 张量也是有序序列&#xff0c;我们可以根据每个元素在系统内的顺序位置&#xff0c;来找出特定的元素&#xff0c;也就是索引。 1.1 一维张量的索引 一维张量由零维张量构成 一维张量索引与Python中的索引一样是是从左到右&#xff0c;从0开始的&#xff…

读写给大家的AI极简史笔记07读后总结与感想兼导读

1. 基本信息 写给大家的AI极简史&#xff1a;从图灵测试到智能物联 [德]托马斯拉姆齐 著 中国友谊出版公司,2019年9月出版 1.1. 读薄率 书籍总字数&#xff1f;&#xff1f;千字&#xff0c;笔记总字数16382字。 读薄率16382&#xff1f;&#xff1f;000≈&#xff1f;&a…

如何解决 Nginx 与虚拟现实设备的集成问题?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 如何解决 Nginx 与虚拟现实设备的集成问题&#xff1f; 如何解决 Nginx 与虚拟现实设备的集成问题&#xff1f; 在当今科技飞速发展的时代&#xff0c;虚拟现实…

钡铼网关实时数据互联,加速IEC104与MQTT云平台对接

随着工业4.0时代的到来&#xff0c;电力系统中的数据采集、监控与远程控制需求日益增长。IEC 104&#xff08;IEC 60870-5-104&#xff09;作为国际电工委员会&#xff08;IEC&#xff09;制定的电力自动化通信协议&#xff0c;广泛应用于电力系统的状态监测、数据采集和设备控…

硅纪元视角 | Stability AI推出Stable Video 4D,40秒生成8角度动态视频!

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;正成为塑造未来的关键力量。硅纪元视角栏目紧跟AI科技的最新发展&#xff0c;捕捉行业动态&#xff1b;提供深入的新闻解读&#xff0c;助您洞悉技术背后的逻辑&#xff1b;汇聚行业专家的见解&#xff0c;…

Sqli-labs-master的21—25通关教程

目录 Less-21(闭合) 查询数据库名 查询数据库中的表 查询表中字段名 查询表中数据 Less-22&#xff08;"闭合&#xff09; 查询数据库名 查询数据库中的表 查询表中字段名 查询表中数据 Less-23 查询数据库名 查询数据库中的表 查询表中字段名 查询表中数据…

基于OSS前端直传的分片上传以及断点续传

一、大文件分片上传 原型 大文件如果直接上传的话由于nginx的限制会导致响应500报错&#xff0c;或者响应时间过长导致响应超时 并且大文件上传有如下缺点 上传时间长: 对于大文件&#xff0c;直接上传可能需要较长时间&#xff0c;特别是在网络速度较慢或不稳定的情况下。这…

深入搞懂Checkpoint调优基础及原理

前言 在执行大量写操作的系统上,调优检查点对于获得良好的性能至关重要。然而,检查点是我们经常发现混淆和配置问题的地方之一,无论是在社区邮件列表中,还是在为客户提供支持和咨询期间。这篇文章旨在解释检查点是什么——目的和数据库如何实现它——以及如何调优它们。 注…

Leetcode—74. 搜索二维矩阵【中等】

2024每日刷题&#xff08;149&#xff09; Leetcode—74. 搜索二维矩阵 实现代码 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m matrix.size();int n matrix[0].size();int l 0;int r m * n;int mid -1…

如何解决 Nginx 与无服务器架构的集成问题?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 如何解决 Nginx 与无服务器架构的集成问题&#xff1f; 如何解决 Nginx 与无服务器架构的集成问题&#xff1f; 在当今的云计算时代&#xff0c;无服务器架构因…