安卓动态加载view

目录

  • 前言
  • 一、addview
    • 1.1 addView 的重载方法
    • 1.2 在 LinearLayout 中的使用
      • 1.2.1 addView(View child)方法的分析:
      • 1.2.2 addView(View child, int index)方法的分析:
      • 1.2.3 小结
    • 1.3 在 RelativeLayout 中的使用
  • 二、addContentview
    • 2.1 测试 1
    • 2.2 测试 2
    • 2.3 测试 3
    • 2.4 测试 4
  • 三、addview 和 addContview 的区别
  • 四、简单的 removeView 和 AddView 测试


前言

对于日常开发来说,一般都是在 XML 中创建想要的 View,然后在代码中通过 id 来找到对应的 View,对其进行相应的操作。但是,这样做有一个前提是,你需要事先知道View 的确切位置,无论其是显示状态还是隐藏状态。那么问题来了,当有这样一个需
求,在启动一个界面以后,在某一条件下需要再向 Activity 中添加一个 View,而这个 View 的位置也是事先未知的,其坐标是某一随机值或者是相对于某一 View 而进行设置的,这个时候我们就要通过 addView 的方式动态向布局中添加 View 了。
(ps:addView 是 ViewGroup 中特有的方法,而单一的 View 是不存在该方法的)


一、addview

1.1 addView 的重载方法

在这里插入图片描述

1.2 在 LinearLayout 中的使用

这里选择使用 LinearLayout 来举例是因为在线性布局中能更好的理解 index 这个参数的含义。大家都知道, LinearLayout 中 View 的排列是按照指定的方向上线性排列的,子View 的索引也是从零开始按照排列的顺序依次递增的。
1.首先新建一个 Activity 并在布局中指定一个 LinearLayout 作为容器。布局文件如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <!--    添加 View 的容器-->
    <LinearLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="400dp"
        android:background="#11da31"
        android:orientation="vertical">
        <!--        事先存在的 View-->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="最初 index 为 0"
            android:textColor="#ffffff"
            android:textSize="25sp" />
        <!--        事先存在的 View-->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="最初 index 为 1"
            android:textColor="#ffffff"
            android:textSize="25sp" />
    </LinearLayout>
    <!--    点击按钮实现添加 View-->
    <Button
        android:id="@+id/btn_add"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="#ffff00"
        android:text="Add View"
        android:onClick="addView"
        android:textAllCaps="false" />
</LinearLayout>

界面的原始布局如图所示:
在这里插入图片描述

编写 Activity 的代码,对控件进行初始化以及点击事件的设置,如下所示:

public class MainActivity extends AppCompatActivity {

    private LinearLayout mContainer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContainer = findViewById(R.id.container);
    }

    /**
     * 按钮点击事件,向容器中添加 TextView
     *
     * @param view
     */
    public void addView(View view) {
        TextView child = new TextView(this);
        child.setTextSize(20);
        child.setTextColor(Color.GREEN);
// 获取当前的时间并转换为时间戳格式, 并设置给 TextView
        String currentTime = dateToStamp(System.currentTimeMillis());
        child.setText(currentTime);
// 调用一个参数的 addView 方法
        mContainer.addView(child);
    }

    /**
     * 将时间戳转换为时间
     */
    public String dateToStamp(long s) {
        String res;
        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMM-dd HH:mm:ss");
            Date date = new Date(s);
            res = simpleDateFormat.format(date);
        } catch (Exception e) {
            return "";
        }
        return res;
    }
}

现在,分别看一下点击三次按钮后的效果图,如下所示:

在这里插入图片描述

1.2.1 addView(View child)方法的分析:

由上述效果图可以初步分析得出结论,在线性布局中,调用 addView(Viewchild)方法时,会在指定的方向的最后一个 View 的下面添加上 child 这个 View,也就是说被添加的 View 的索引总是等于容器中当前子 View 的个数。为了证实这一结论,只好看一下源码了,顺着方法的调用一路找到了 addViewInner 方法(下面只是复制了关键性的代码,可以自己去源码查看哈)
在这里插入图片描述
现在可以肯定的说,此方法每次添加的 View 最终 index(索引)都为未添加之前父布局中子 view 的总数,因此每次都是在最后一个 View 的后面添加 child。

1.2.2 addView(View child, int index)方法的分析:

此方法相对于上面的方法多了一个 index 参数,也就是调用此方法时我们会给被添加的View 指定一个索引。下面,来修改一下上面的代码:

    public void addView(View view) {
        TextView child = new TextView(this);
        child.setTextSize(20);
        child.setTextColor(Color.YELLOW);
// 获取当前的时间并转换为时间戳格式, 并设置给 TextView
        String currentTime = dateToStamp(System.currentTimeMillis());
        child.setText(currentTime);
// 调用一个参数的 addView 方法
        mContainer.addView(child,1);
    }

运行程序,并同样看一下点击此按钮三次后的效果图:

在这里插入图片描述
效果一目了然,当为添加的 View 指定了 index 后,被添加的 View 就会被添加到容器中指定的索引位置处,并把之前的 View(包括此 View 后面的 View)全部向后“挤” 了一位,没错,就是这么强势!
细心的人都会有一个疑问吧!这个 index 可不可以随意定义呢?答案当然是不可以了。凡事都要讲究一个顺序嘛,总不能原来容器中只有 2 个子 View,最大的索引才是 1,你就一下子想把添加的 View 指定到索引 10 吧。因此,在我们向指定索引的时候,
我们应当先做一个判断,确保我们指定的 index 不能大于当前容器内 View 的总数量。代码可以如下

        int index = new Random().nextInt();
        if (index > mContainer.getChildCount()) { // 当 index 大于当前容器子 View 数量时,让他等于容器内子 View 的数量。
            index = mContainer.getChildCount();}
        mContainer.addView(child, index);

如果数字超过view数量,会崩溃,报数字越界异常!

1.2.3 小结

LinearLayout 中 addView 的使用就只介绍这两种方法,这里我指定线性布局的排列方向为垂直方向,当然指定为水平方向也是一样的效果,只是在添加 View 的方向上变为了水平方向的改变。在这里讲解调用这两个参数的方法主要是因为在 LinearLayout 中能更好的理解一些。下面看一下 addView 方法在 RelativeLayout 中的使用。

1.3 在 RelativeLayout 中的使用

布局文件:
首先修改布局文件,这里将最初顶部的容器改为一个空的 RelativeLayout。底下的按钮变成了两个,分别用于添加颜色不同的 View。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#dd7562"
    android:orientation="vertical">
    <!--    添加 View 的容器-->

    <!--    点击按钮实现添加 View-->
    <Button
        android:id="@+id/addwhite"
        android:layout_width="150dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:background="#ffff00"
        android:onClick="addWhite"
        android:text="Add white"
        android:textAllCaps="false" />

    <Button
        android:id="@+id/addblack"
        android:layout_width="150dp"
        android:layout_height="50dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:background="#ffff00"
        android:onClick="addBlack"
        android:text="Add black"
        android:textAllCaps="false" />
</RelativeLayout>

看一下改完的初始效果图:
在这里插入图片描述

定义两个按钮的点击事件,代码如下

    // 左边按钮点击事件
    public void addWhite(View view) {
        TextView child = new TextView(this);
        child.setTextSize(25);
        child.setTextColor(getResources().getColor(R.color.white));
        child.setText("LayoutParams");
        mContainer.addView(child);
    }

    //右边按钮点击事件
    public void addBlack(View view) {
        TextView child = new TextView(this);
        child.setTextSize(25);
        child.setTextColor(getResources().getColor(R.color.black));
        child.setText("LayoutParams");// 定义 LayoutParam
        RelativeLayout.LayoutParams params = new
                RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT);
        params.leftMargin = 100;
// 调用带有 LayoutParams 参数的 addView 方法
        mContainer.addView(child, params);
    }

运行程序,先点击一次左侧按钮,再点击一次右侧按钮,效果图如下(只截取了内如区域)

在这里插入图片描述
看到图中的黑色的 TextView 相对于父容器的左边产生了 100 像素的间距,说明指定的LayoutParams 确实生效了。而此处也只是运用了 LayoutParams 相对简单的使用方式,只是为了说明 addView 方法,可以为添加的 View 指定 LayoutParams。

上面运行结果是我先点击左侧的按钮,后点击的后侧按钮。现在我们反过来,先点击右侧的按钮,再点击左侧的按钮,效果如下:
在这里插入图片描述

第一张是黑色的字体在上面,而第二张是白色的字体在上面。那么根据此结果,其实可以理解在 RelativeLayout 中 index
的含义了,可以认为它指定了 View 在里面的层级。一个 View 的 index 越大,说明它越在上面。这一点在 FrameLayout 中是一样的! (注意,如果在使用 addView 时候想设置index,也要遵循上面说到的规则)

小结
在 RelativeLayout 中使用 addView 方法就介绍这么多。现在, addView 中不同的参数就已经都知道什么意义了,那么即使有的方法是混合使用它们的也应该会使用了。剩下一个是指定宽高的方法我就不介绍了,这个有点太通俗易懂了。


二、addContentview

2.1 测试 1

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
/**
 * addContentView()测试 1
 */
        LinearLayout l1 = new LinearLayout(this);
        l1.setLayoutParams(new
                LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,
                LinearLayout.LayoutParams.FILL_PARENT));
        l1.setOrientation(LinearLayout.VERTICAL);
        l1.setBackgroundColor(Color.RED);
        Button b1 = new Button(this);
        b1.setText("Ok");
        LinearLayout.LayoutParams ll1 = new
                LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        LinearLayout.LayoutParams ll2 = new
                LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,
                LinearLayout.LayoutParams.FILL_PARENT);
        ll1.topMargin = 50;
        ll1.leftMargin = 100;
//l1.addView(b1, ll1);
        addContentView(l1, ll2);//区别在哪
// setContentView(l1);//区别在哪
    }
}

测试结果为
在这里插入图片描述

省略了 button 的添加和最后一句 setContentView(l1);
只有 LinearLayout 的创建以及它的属性 LayoutParams,所以只有全屏红色背景

2.2 测试 2

将//l1.addView(b1, ll1);省略号去点之后, Button 可见,如图所示
在这里插入图片描述

因为 Button 的 LayoutParams ll1 设置了 margin,所以与左边界、上边界有一定的距离。

2.3 测试 3

去掉最后的 // setContentView(l1); 界面如图所示

在这里插入图片描述

可以发现此结果与测试 2 并未有何差异,这是为什么呢?
原来主要的原因是 addContentView 和 setContentView 的区别:
两者的区别主要包括两点:

  1. 已添加 UI 组件是否被移除
    setContentView() 会导致先前添加的被移除, 即替换性的;而 addContentView() 不会移除先前添加的 UI 组件,即是累积性的
  2. 是否控制布局参数
    addContentView() 有两个参数, 可以控制布局参数; 指出的这个 setContentView没有接受布局参数,
    默认使用 MATCH_PARENT; 不过 setContentView()也有带两个参数的版本, 可以控制布局参数

2.4 测试 4

该代码对理解 addContentView()以及 LayoutParams 有更加直观的对比理解

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams
                (FrameLayout.LayoutParams.FILL_PARENT,
                        FrameLayout.LayoutParams.WRAP_CONTENT);
//设置顶部,左边布局
        params.gravity = Gravity.TOP | Gravity.LEFT;
        TextView top = new TextView(this);
//控件字体位置位于左边
        top.setGravity(Gravity.LEFT);
        top.setText("顶部");
//添加控件
        addContentView(top, params);
        FrameLayout.LayoutParams params2 = new FrameLayout.LayoutParams
                (FrameLayout.LayoutParams.FILL_PARENT,
                        FrameLayout.LayoutParams.WRAP_CONTENT);
//设置中间位置
        params2.gravity = Gravity.CENTER;
        TextView center = new TextView(this);
//字体位于中部
        center.setGravity(Gravity.CENTER);
        center.setText("中部");
//添加控件
        addContentView(center, params2);
        FrameLayout.LayoutParams params3 = new FrameLayout.LayoutParams
                (FrameLayout.LayoutParams.FILL_PARENT,
                        FrameLayout.LayoutParams.WRAP_CONTENT);
//设置底部
        params3.gravity = Gravity.BOTTOM | Gravity.RIGHT;
        Button bottom = new Button(this);
//字体位于中部
        bottom.setGravity(Gravity.RIGHT);
        bottom.setText("底部");
//添加控件
        addContentView(bottom, params3);
    }
}

测试结果为

在这里插入图片描述


三、addview 和 addContview 的区别

1.addview:Android Studio 上点开此方法,可以看到此方法是 ViewGroup类下的一个方法,相当于在一个容器里去添加view。
此方法适用于 ViewGroup 以及其子类下的 view 相关的类去使用
2.addContview: Android Studio 上点开此方法,可以看到此方法是AppCompatActivity 下的一个方法,相当于去添加一个上层的、累积性的布局,大多使用在 Activity 里。


四、简单的 removeView 和 AddView 测试

平时我们在 Activity 类中的 onCreate()方法内,加载布局是这么写的:
在这里插入图片描述
现在不这么写,换一种写法来加载布局

在这里插入图片描述

activity_main.xml 文件:

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

   <TextView
       android:id="@+id/TV"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="Hello World!" />

   <ImageView
       android:id="@+id/IV"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:src="@mipmap/ic_launcher" />
</LinearLayout>

可以看出,orientation 是 vertical,垂直排列的,然后写了两个控件,一个TextView 和一个 ImageView。运行一下,效果是这样的。

在这里插入图片描述
然后,我们去除一个 view,看看效果。既然是要去除 view,那么我们就要先获得 view,我们的 activity_main.xml 文件里有两个 view,一个 TextView,一个ImageView,我们就先获得 TextView,然后再把它去除吧。

TextView tvMain = (TextView) linearLayout.findViewById(R.id.TV);
linearLayout.removeView(tvMain);

记住,是先获得要去除的 view,再用 removeView 方法把这个 View 从对应的ViewGroup 中去除。然后我们看看效果。
在这里插入图片描述

可以看到布局里的 TextView 已经被移除了,然后 ImageView 自动的顶到了原先TextView 的位置。
OK,试过了 removeView 方法,接下来尝试一下 addView 方法,从另外一个布局文件里获取 view,然后加 activity_main 布局里来。再写一个布局文件 test_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <TextView
        android:id="@+id/tv_test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="test,hahaha" />
</LinearLayout>
public class MainActivity extends AppCompatActivity {
    LinearLayout linearLayout;

    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        linearLayout = findViewById(R.id.container);
        LayoutInflater inflater = (LayoutInflater)
                getSystemService(LAYOUT_INFLATER_SERVICE);
        LinearLayout linearLayout1 = (LinearLayout)inflater.inflate(R.layout.test_layout,
                null);
        TextView tvTest = (TextView)linearLayout1.findViewById(R.id.tv_test);
        linearLayout1.removeView(tvTest);
        linearLayout.addView(tvTest);

    }
}

先把 tvTest 从 linearLayout1 中去除,然后再添加到 linearLayout 中。运行一下,看看效果。

在这里插入图片描述

可以看到在 ImageView 的下方添加了 tvTest。


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习之基于Pytorch姿态估计的仰卧起坐计数系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 仰卧起坐作为一种常见的健身动作&#xff0c;被广泛用于腹部肌肉的锻炼。然而&#xff0c;对于仰卧起…

Java17 --- SpringCloud之Nacos

目录 一、下载nacos并运行 1.1、创建9001微服务作为提供者 1.2、创建80微服务作为消费者 二、naocs配置中心规则与动态刷新 2.1、创建3377微服务 2.2、在nacos中创建配置文件 三、nacos数据模型之Namespace-Group-Datald 3.1、DatalD方案 3.2、Group方案 3.3、Name…

Vite构造Vue3

环境安装 node.js安装-CSDN博客 初始化Vue项目安装脚手架_vue init webpack安装脚手架-CSDN博客 选择Vue框架 &#xff0c;项目名称可以自定义&#xff0c;我使用默认的 vite-project 选择JS 进入项目安装依赖

Windows平台通过MobaXterm远程登录安装在VMware上的Linux系统(CentOS)

MobaXterm是一个功能强大的远程计算工具&#xff0c;它提供了一个综合的远程终端和图形化的X11服务器。MobaXterm旨在简化远程计算任务&#xff0c;提供了许多有用的功能&#xff0c;使远程访问和管理远程服务器变得更加方便&#xff0c;它提供了一个强大的终端模拟器&#xff…

视频号小店在行业内的门槛高不高?有门槛是好事还是坏事?

大家好&#xff0c;我是电商小V 现在伴随着时代的慢慢发展&#xff0c;很多人都是想找一个好一点的创业项目&#xff0c;现在找创业项目都是找一些稍微有门槛的项目&#xff0c;没有门槛的话&#xff0c;要不然刚开始去做&#xff0c;项目就泛滥了&#xff0c;项目的红利期直接…

哪个牌子的电容笔好用?618五款爆款电容笔评测,不踩雷!

随着信息技术不断发展&#xff0c;iPad慢慢成为了现代年轻人工作、娱乐和学业的必备智能工具之一。然而&#xff0c;市场上涌现出众多品牌的电容笔&#xff0c;也存在着大量低质量的电容笔产品。这些产品往往无法达到预期的书写和绘画效果&#xff0c;反而可能导致用户体验不佳…

【kali换源之后签名无效,报错处理】

#一、问题&#xff1a;报错信息# 错误:1 http://mirrors.ustc.edu.cn/kali kali-rolling InRelease 错误:2 http://mirrors.tuna.tsinghua.edu.cn/kali kali-rolling InRelease 错误:3 http://dl.google.com/linux/chrome/deb stable InRelease 错误:4 http://mirrors.aliyu…

PyQt5中重要的概念:信号与槽

PyQt中信号与槽概念定义如下&#xff08;网络上引用的&#xff09;&#xff1a; 信号&#xff08;signal&#xff09;和槽&#xff08;slot&#xff09;是Qt的核心机制&#xff0c;也是在PyQt编程中对象之间进行通信的机制。在创建事件循环之后&#xff0c;通过建立信号和槽的…

2024上半年软考机考新政策:科目连考、分批次考试

辽宁省信息技术教育中心发布了《关于2024年上半年计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试批次安排的通知》。 该通知明确了2024上半年软考辽宁考区的考试时间、考试方式、考试批次安排&#xff0c;与2023下半年软考机考形式有多处调整。 1、考试时间&am…

vtk教程:禁止VTK弹出警告窗口warning

在使用VTK&#xff08;Visualization Toolkit&#xff09;进行可视化操作时&#xff0c;有时候会弹出警告窗口&#xff08;warning messages&#xff09;&#xff0c;这些警告可能是由于数据问题或是API使用不当等原因触发的。 如果你希望在使用VTK时禁用这些警告窗口&#xff…

【微信小程序开发】微信小程序注册,配置开发者工具

准备工作 微信小程序小程序开发流程 开发过程注册小程序开发者工具开发界面介绍 微信小程序 一种新的开发能力&#xff0c;可以在微信内被便捷的获取和传播&#xff0c;具有出色的用户体验 地址&#xff1a;https://mp.weixin.qq.com/ 注册微信小程序 在进行开发之前我们应该…

09 华三 SSH

03 华三SSH 远程登录 1 AI解说官网 Kimi.ai - 帮你看更大的世界 (moonshot.cn) 华三交换机的SSH配置主要目的是通过SSH协议实现安全的远程登录和管理&#xff0c;以确保数据传输的安全性。以下是配置SSH的一般步骤和思路&#xff1a; 生成密钥对&#xff1a;首先需要在交换…

【重要】MThings V0.6.3更新要点

我们听到了您的声音并采取了行动&#xff01;现在为您提供了一次全面的软件升级&#xff0c;让您的体验更加顺畅、稳定和安全。立即更新&#xff0c;畅享新功能&#xff01; 下载地址&#xff1a; http://gulink.cn/download 重要通知&#xff1a; 摩尔信使MThings即将发布全新…

从ChatGPT革命性的对话系统,看人机交互模式6个阶段的演变

ChatGPT引领革命&#xff0c;看人机交互六步飞跃 ©作者|wy 来源|神州问学 引言 在科技的浪潮中&#xff0c;人机交互模式不断演进&#xff0c;从最初的简单指令输入到如今的智能对话系统&#xff0c;每一次革新都昭示着人类与机器交流方式的深刻变革。ChatGPT&#xff0…

小吉/希亦/鲸立内衣洗衣机怎么样?深度测评谁更好用!

内衣洗衣机是近几年新兴的家电产品&#xff0c;以清洁效果好、除菌能力强&#xff0c;被很多人种草入手了&#xff01;但网上有不少人虽感兴趣&#xff0c;但不清楚如何选。担心买到质量差&#xff0c;清洗不干净的产品。作为一名家电测评博主&#xff0c;我今天特意围绕被问最…

[AIGC] 事务的四大特性是怎么实现的

文章目录 原子性是通过 undo log实现的。一致性是通过 redo log实现的。隔离性的实现 &#xff08;分事务的隔离级别讨论&#xff09;持久性是利用 redo log 实现的 写入过程 原子性是通过 undo log实现的。 事务的所有 修改操作 (增、删、改)的相反操作都会写入undo log, 比如…

电脑快捷键怎么设置?记好这3个设置方法!

“作为一个职场小白&#xff0c;我对很多快捷键的应用都不是很熟悉&#xff0c;这导致我工作效率总是很低&#xff0c;大家平常在使用电脑时有什么比较好用的电脑快捷键设置方法给我推荐一下吗&#xff1f;” 在数字化时代&#xff0c;电脑已成为我们日常生活和工作的必备工具。…

基于Java.Web框架React、Vue.js技术开发的一套(C#医院体检系统成品源码、支持二开)

医院体检系统是一种专为体检中心/医院体检科等体检机构开发的全流程管理系统。该系统通过软件实现检测仪器数据的自动提取&#xff0c;内置多级医生工作台&#xff0c;细化工作并将体检检查结果汇总&#xff0c;生成体检报告登记到计算机系统中。此外&#xff0c;该系统还能进行…

什么是水经微图网络加密锁?

水经微图&#xff0c;以下简称“微图”。 我们在《什么是水经微图加密锁&#xff1f;》一文中&#xff0c;为你分享了什么是微图加密锁&#xff0c;以及其使用的方法。 现在&#xff0c;我们再为你分享什么是网络加密锁&#xff0c;以及其使用的方法。 什么是网络加密锁&…

微服务---feign调用服务

目录 Feign简介 Feign的作用 Feign的使用步骤 引入依赖 具体业务逻辑 配置日志 在其它服务中使用接口 接着上一篇博客&#xff0c;我们讲过了nacos的基础使用&#xff0c;知道它是注册服务用的&#xff0c;接下来我们我们思考如果一个服务需要调用另一个服务的接口信息&…