安卓动态添加View

动态添加和删除View:Android开发核心技能 本文还有配套的精品资源,点击获取 简介:在Android开发中,动态添加和删除View是构建可扩展用户界面的关键需求。本教程将详细指导如何在Java环境中实现这一过程,涵盖从基础概念到性能优化的各个方面。 1. Android View与ViewGroup基本概念 Android View与ViewGroup基本概念 在Android开发中,View是... 阅读详情
AI摘要

博客围绕安卓应用中动态添加View展开。指出在获取商品列表等场景需动态添加View,介绍了两种方法,一是代码生成子View,较繁琐;二是从xml读取布局并动态设置信息,推荐使用。还给出了父View布局、子View布局、activity类和实体类的代码实现。

在安卓应用中,有很多时候需要动态添加View。比如从后台获取商品列表,根据商品数量在页面渲染对应数量的条目,这时候就需要动态添加View。

1.动态添加View的方法

动态添加View有两种方法:

  • 由代码生成子View:这种方式很繁琐,布局效果也不直观,而且很多属性设置不了(也可能是我没找对方法);
  • 从xml读取布局,然后动态设置信息:推荐该方式,配置xml时,可以直接看到效果,可设置的参数也更多。

接下来就用代码演示下如何使用这两种方式动态添加View。

注:子View也可以写在父View中,设置visible为GONE即可,在createItem最后添加一行item.setVisibility(View.VISIBLE);。

2. 代码实现

父View布局activity_list.xml:

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

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="480dp"
        android:layout_gravity="center_horizontal|top"
        android:layout_margin="10dp">

        <LinearLayout
            android:id="@+id/list_items"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" />
    </ScrollView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal">

        <Button
            android:id="@+id/list_switch_model"
            android:layout_width="100dp"
            android:layout_height="70dp"
            android:layout_gravity="center"
            android:layout_marginRight="20dp"
            android:text="Switch Model" />

        <Button
            android:id="@+id/list_add_item"
            android:layout_width="100dp"
            android:layout_height="70dp"
            android:layout_gravity="center"
            android:layout_marginLeft="20dp"
            android:text="Add Item" />
    </LinearLayout>
</LinearLayout>

子View布局activity_item.xml:

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

    <LinearLayout
            android:id="@+id/item"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:layout_marginBottom="5dp"
            android:orientation="horizontal">

        <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:gravity="right|center"
                android:orientation="horizontal">

            <ImageView
                    android:id="@+id/item_img"
                    android:layout_width="48dp"
                    android:layout_height="48dp"
                    android:layout_marginLeft="10dp"
                    android:layout_marginRight="10dp"
                    android:padding="10dp"
                    android:src="@drawable/common_item" />
        </LinearLayout>

        <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_gravity="center"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:gravity="left|center"
                android:orientation="vertical">

            <TextView
                    android:id="@+id/item_index"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="index: item name"
                    android:textColor="@color/black"
                    android:textSize="6pt" />

            <TextView
                    android:id="@+id/item_name"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="name: item name"
                    android:textColor="@color/black"
                    android:textSize="6pt" />
        </LinearLayout>

        <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center_vertical"
                android:layout_marginRight="10dp"
                android:gravity="right|center"
                android:orientation="horizontal">

            <ImageView
                    android:id="@+id/item_edit"
                    android:layout_width="48dp"
                    android:layout_height="48dp"
                    android:layout_marginRight="10dp"
                    android:padding="10dp"
                    android:src="@drawable/common_edit" />

            <ImageView
                    android:id="@+id/item_delete"
                    android:layout_width="48dp"
                    android:layout_height="48dp"
                    android:layout_marginRight="10dp"
                    android:padding="10dp"
                    android:src="@drawable/common_delete" />
        </LinearLayout>
    </LinearLayout>
</LinearLayout>

activity类:

package com.example.study.activities;

import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.activity.ComponentActivity;
import androidx.annotation.Nullable;

import com.example.study.R;
import com.example.study.entities.ItemInfo;

import java.util.ArrayList;
import java.util.List;

public class DynamicViewActivity extends ComponentActivity {
    private int index = 0;

    private boolean createViewFromXml = true;

    private List<ItemInfo> itemInfos = new ArrayList<>();

    private LinearLayout listItemsLayout;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);
        listItemsLayout = findViewById(R.id.list_items);
        initButton();
        initDynamicView();
    }

    private void initDynamicView() {
        if (listItemsLayout == null) {
            return;
        }
        listItemsLayout.removeAllViews();
        for (ItemInfo itemInfo : itemInfos) {
            listItemsLayout.addView(createViewFromXml ? createViewFromCode(itemInfo) : createViewFromCode(itemInfo));
        }
    }

    private void initButton() {
        findViewById(R.id.list_add_item).setOnClickListener(view -> {
            if (listItemsLayout == null) {
                return;
            }
            ItemInfo itemInfo = new ItemInfo(index, "name " + index, R.drawable.common_item);
            index++;
            itemInfos.add(itemInfo);
            listItemsLayout.addView(createViewFromXml ? createItem(itemInfo) : createViewFromCode(itemInfo));
        });
        findViewById(R.id.list_switch_model).setOnClickListener(view -> {
            itemInfos.clear();
            listItemsLayout.removeAllViews();
            createViewFromXml = !createViewFromXml;
        });
    }

    /**
     * 在代码中生成布局作为子view的布局
     *
     * @param itemInfo item信息
     * @return item view
     */
    private View createViewFromCode(ItemInfo itemInfo) {
        // item开头的图标layout
        ImageView itemImage = new ImageView(this);
        itemImage.setImageResource(R.drawable.common_item);
        itemImage.setMaxHeight(136);// 这个高度跟dp的换算,需要根据屏幕分辨率重新计算。下同
        itemImage.setMaxWidth(136);
        itemImage.setLeft(10);
        itemImage.setRight(10);
        itemImage.setPadding(5, 5, 5, 5);
        itemImage.setAdjustViewBounds(true);

        LinearLayout imageLayout = new LinearLayout(this);
        imageLayout.setOrientation(LinearLayout.HORIZONTAL);
        imageLayout.addView(itemImage);

        // item信息layout
        TextView index = new TextView(this);
        index.setText("index: " + itemInfo.getIndex());
        index.setTextSize(10);

        TextView name = new TextView(this);
        name.setText("name: " + itemInfo.getName());
        name.setTextSize(10);

        LinearLayout infoLayout = new LinearLayout(this);
        infoLayout.setOrientation(LinearLayout.VERTICAL);
        infoLayout.addView(index);
        infoLayout.addView(name);

        // 操作layout
        ImageView edit = new ImageView(this);
        edit.setImageResource(R.drawable.common_edit);
        edit.setMaxHeight(136);
        edit.setMaxWidth(136);
        edit.setAdjustViewBounds(true);


        ImageView delete = new ImageView(this);
        delete.setImageResource(R.drawable.common_delete);
        delete.setMaxHeight(136);
        delete.setMaxWidth(136);
        delete.setAdjustViewBounds(true);

        LinearLayout operateLayout = new LinearLayout(this);
        operateLayout.setOrientation(LinearLayout.HORIZONTAL);
        operateLayout.addView(edit);
        operateLayout.addView(delete);

        // 子view的信息
        LinearLayout layout = new LinearLayout(this);
        layout.setOrientation(LinearLayout.HORIZONTAL);
        layout.addView(imageLayout);
        layout.addView(infoLayout);
        layout.addView(operateLayout);

        edit.setOnClickListener(view -> {
            // todo 此处处理edit的点击事件
            Log.i("itemInfoList: ", itemInfos.toString());
        });

        delete.setOnClickListener(view -> {
            itemInfos.remove(itemInfo);
            listItemsLayout.removeView(layout);
        });

        return layout;
    }

    /**
     * 从xml文件获取布局作为子view的布局
     *
     * @param itemInfo item信息
     * @return item view
     */
    private View createItem(ItemInfo itemInfo) {
        LinearLayout inflate = (LinearLayout) LayoutInflater.from(this).inflate(R.layout.activity_item, null);
        LinearLayout item = inflate.findViewById(R.id.item);
        ((ImageView) item.findViewById(R.id.item_img)).setImageResource(itemInfo.getImageResourceId());
        ((TextView) item.findViewById(R.id.item_index)).setText("index: " + itemInfo.getIndex());
        ((TextView) item.findViewById(R.id.item_name)).setText("name: " + itemInfo.getName());
        item.findViewById(R.id.item_edit).setOnClickListener(view -> {
            // todo 此处处理edit的点击事件
            Log.i("itemInfoList: ", itemInfos.toString());
        });
        item.findViewById(R.id.item_delete).setOnClickListener(view -> {
            itemInfos.remove(itemInfo);
            listItemsLayout.removeView(item);
        });
        ((ViewGroup) item.getParent()).removeAllViews();
        return item;
    }
}

实体类:

package com.example.study.entities;

public class ItemInfo {
    private int index;

    private String name;

    private int imageResourceId;

    public ItemInfo(int index, String name, int imageResourceId) {
        this.index = index;
        this.name = name;
        this.imageResourceId = imageResourceId;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getImageResourceId() {
        return imageResourceId;
    }

    public void setImageResourceId(int imageResourceId) {
        this.imageResourceId = imageResourceId;
    }

    @Override
    public String toString() {
        return "ItemInfo{" +
                "index=" + index +
                ", name='" + name + '\'' +
                ", imageResourceId=" + imageResourceId +
                '}';
    }
}
红外回充方案之红外接收和发射/附源码(1) 本文介绍了基于NEC协议的红外回充方案实现,重点讲解了红外收发原理和GD32F330单片机的接收端实现。文章首先说明采用38kHz载波和一体化红外接收管的设计优势,能有效抗环境光干扰。接着详细解析NEC协议格式,包括9ms起始信号、地址码、命令码及其反码校验机制,并给出逻辑1和0的调制方式。在接收端实现上,展示了GD32F330定时器输入捕获配置代码,通过双边沿触发测量脉冲宽度进行解码。文章还提供了状态机设计思路和数据结构,为低成本机器人红外回充方案提供了完整的技术实现方案。 阅读详情

相关推荐

RV1106G3的AOV下的yolov5调试记录

本文介绍了基于LuckFoxPicoMax开发板的RV1106芯片调试经验,重点包括AOV(Always-On Vision)和Yolov5目标检测的实现。在硬件方面,板载1TOPS NPU、256MB内存,并更换为SPI NOR存储。软件调试涉及MK配置文件修改、设备树调整(按键唤醒和sensor配置)以及程序自启动设置。Yolov5模型优化为320*320尺寸,推理时间约45ms。系统采用VI采图与AI识别通过共享内存通信的方案,实测功耗在20-35mA范围。文章还指出了当前存在的功耗优化、ISP调试等

fzktongyong的博客 1710

Android addview—动态添加view

一、前言 在日常的开发中经常遇到需要动态添加子view的情况,addview是ViewGroup的特有方法,可以在布局中动态添加view,而view是不存在这个方法的。 二、使用方式 1.方法介绍 addview有以下几种方式 addView(View child) // child 被添加的View addView(View child, int index) // index 被添加的View的索引 addView(View child, int width, int height) //

分享Android开发知识 1万+

在昇腾910B服务上部署搭建适配PDF解析工具Mineru2.5开源项目

本文介绍了在昇腾910B服务器上部署开源PDF解析工具Mineru2.5的过程。首先从昇腾社区下载mindie镜像并运行容器,安装系统依赖。针对部署过程中遇到的多个报错问题(如torchvision与torch版本不匹配、昇腾软件栈与NumPy 2.0不兼容等),提供了具体解决方案和兼容版本。通过设置环境变量、安装指定版本的Python依赖包,成功部署Mineru项目并下载模型。最后运行测试,验证了在NPU设备上运行pipeline的可行性。整个过程详细记录了版本适配和错误处理方法,为类似部署场景提供了参考

一起加油吧 2163

安卓动态加载view

安卓动态加载view

似霰的博客 2435

【UE5 C++开发指南】从零配置Visual Studio 2022开发环境

本文详细指导如何从零开始为UE5 C++开发配置Visual Studio 2022环境。文章强调了VS2022与UE5的深度兼容性,并逐步讲解了社区版下载、核心工作负载(如“使用C++的游戏开发”)与组件安装、界面优化、专属工具设置以及首个C++项目的创建与验证流程,帮助开发者高效搭建专业开发环境。

weixin_29016865的博客 392

全在这了!全国分省90米、30米、12.5米、5米DEM高程模型数据下载方式汇总

全在这了!全国分省90米、30米、12.5米、5米DEM高程模型数据下载方式汇总 SRTM15(450米)免费下载 https://pan.baidu.com/s/1eO0U6wfzs7YSe2EQdxRJ2Q提取码:o7am GMTED(250米)免费下载 https://pan.baidu.com/share/init?surl=nrbbdbhyNVQV46XwqzqLlg 提取码:V7X9 SRTM3 (90米)免费下载 https://pan.baidu.com/share/..

TuxinyunGIS的博客 1万+

Android动态添加view设置view大小(宽高)

第一种:ViewGroup在添加子view的时候设置layoutParams。第二种:子view本身设置layoutParams。

Dream It Possible 2033

西门子V90 PN伺服控制核心:FB284功能块详解与实战

在工业自动化中,伺服定位控制是运动控制的基础环节,其本质是PLC通过PROFINET协议与伺服驱动器实现高速、确定性数据交互。FB284作为西门子为V90 PN定制的标准化功能块,封装了GSD映射、状态机管理与周期性PDO同步机制,将底层寄存器操作抽象为高可靠调用接口。相比MOVE指令或MC_MoveAbsolute等通用方案,FB284显著降低时序错乱风险,提升多轴同步精度与故障响应能力。它广泛应用于包装、灌装、装配等中端产线,尤其适配S7-1200/1500平台下的快速部署与现场维护。本文聚焦V90 P

weixin_42696271的博客 298

Android 布局中动态添加View(两种方式)

动态添加

qq_39994562的博客 3902

结构力学本构模型:复合材料模型:复合材料热力学行为技术教程_2024-08-07_06-54-53.Tex

热塑性复合材料是一种由热塑性树脂基体和增强纤维组成的复合材料。与热固性复合材料不同,热塑性复合材料在加热时可以软化,冷却时硬化,这一过程可以重复进行,因此它们具有可回收和可再加工的特性。热塑性树脂,如聚酰胺(尼龙)、聚碳酸酯、聚醚醚酮(PEEK)等,与碳纤维、玻璃纤维等增强材料结合,可以制备出具有高强度、高刚度和良好耐热性的复合材料。热粘弹性理论是研究材料在温度变化和时间依赖性载荷作用下的变形和应力响应。复合材料,由于其独特的微观结构,展现出复杂的热粘弹性行为。

808

7.1华为OD机试真题 新系统 - 仓库盘点 (Java/Py/C/C++/Js/Go)

7.1华为OD机试真题 新系统 - 仓库盘点 (Java/Py/C/C++/Js/Go)

算法大师! 506

Android动态添加View方法总结

问题         在写学生签到页面时需要根据签到的状态和方式不同展示不同的页面,如果把他们都写在一个页面那么页面的布局就会很臃肿,这时想到了可不可以进行动态添加View,在查阅了一些博客之后学习了一些添加方法,在这里做个总结。 对比图 ...

haazzz的博客 3948

北斗导航 | 卫星信号捕获跟踪原理解析

卫星信号的捕获与跟踪是导航接收机的"眼睛",其性能直接决定定位精度、动态适应性和抗干扰能力。随着北斗三号全球组网完成,新一代接收机正朝着。两大核心阶段,二者共同构成定位的基础。调制,频谱主瓣宽度达4.092MHz,较传统BPSK调制抗干扰能力提升3dB[38]。的目标持续演进,在自动驾驶、精密农业等领域展现出巨大应用潜力。二维空间中搜索峰值相关能量[4]。卫星导航接收机对信号的处理可分为。北斗三号B1C/B2a信号采用。北斗三号新增的B1C信号采用。

尘世冰封的专栏 772

android 在LinearLayout中动态添加View

android 在LinearLayout中动态添加View前言了解使用参考完事 前言 在项目中有一个列表,列表里的item里面还有一个未知个数的横向列表 用列表来做,RecyclerView、ListView、GridView都需要另外再写一个Adapter,显得麻烦。这时候直接用一个横向的LinearLayout来使用addView方法就很方便了 了解 addView是ViewGroup中特...

杨迪龙的博客 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android 动态改变view,Android 动态添加 View 并显示在指定位置

原始代码:protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}决定放置的位置:public void setX(float x) {setTranslationX(x - mLeft);}publi...

weixin_35401836的博客 1419

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

安卓ui设计之动态添加view

在ui设计当中,有时候需要动态添加动态view。这时候安卓提供了一些动态添加view的接口。注意addView是相对ViewGropu来说的,单独的View没有addView方法。 addView(View child) // child:添加的View addView(View child, int index) // index:添加的View的索引 addView(View chil...

Ian22l的博客 355

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android两种方式实现动态添加View

最近有个需求是在布局上动态添加view,本来想写死的,但是发现这样写后期需求变动后改动很大,不灵活,还得重新写,于是研究了一下在布局上动态添加view的方式。 1.初始化View: 2.初始化事件监听 3.向容器中添加TextView 4.添加一个布局. . 5.移除最后一个View: //根据view的数量移除最后一个 View view = llCont...

u012556114的博客 5561

android activity中动态添加view

Android中动态添加View的实现 在Android开发中,动态添加View是一种常见需求。通过编写代码,可以在运行时向Activity或Fragment添加View,以实现灵活的用户界面。本文将详细介绍如何在Android Activity中动态添加View,并提供相关的代码示例。 动态添加View的基本概念 在An...

weixin_40599155的博客 477

android 动态添加View

项目中遇到动态添加view的需求来展示视频画面,整理一下供大家参考 import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphi...

八戒卖萌的博客 1128

Android如何在运行时动态添加View

文章目录前言1. 动态添加TextView2. 动态添加layout3. 在layout中携带各种数据4. 动态删除view5.参考材料 前言 主要是使用ViewGroup类中的addView方法,就可以很方便的直接将view添加到ViewGroup中 我们平时用的LinearLayout或者GridLayout等,都是ViewGroup的子类,所以也都有这个方法。 准备一个button和一个linearlayout,只要点击一次button,就往linearlayout中添加一个view <Line

wodongx123的博客 1274

Android 用代码动态添加View(ViewGroup.addView()),并进行动态添加View适配,屏幕适配

Android 获取View的位置参数:x,y和相对父容器的偏移量以及中心点坐标Android 利用代码动态添加Viw关于代码中的屏幕适配最后,奉上工具类感谢观看 你好! Android 利用代码动态添加Viw 首先,看一下动态添加View的方法: 然后,我们能看到,addView又五个重载方法,是: addView(View child) // 直接添你要添加的View addView(...

chaseDreamer_的博客 1万+

android 的gridview中动态添加view,Android动态添加View的问题解决方法

后台代码private void ChangeView(){ly.removeAllViews();LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);View layout = inflater.inflate(R.layout.grid,null);GridView gridvi...

weixin_42298927的博客 625

Android动态添加View

文章目录addView的使用在LinearLayout中的使用addView(View child)addView(View child, int index)小结在RelativeLayout中的使用index在RelativeLayout中有用吗? 动态添加View我们就要通过addView的方式动态向布局中添加View。(ps:addView是ViewGroup中特有的方法,而单一的View...

Errol's Blog 1629

android动态添加控件在指定位置,Android 如何动态添加 View 并显示在指定位置。

引子最近,在做产品的需求的时候,遇到 PM 要求在某个按钮上添加一个新手引导动画,引导用户去点击。作为 RD,我哗啦啦的就写好相关逻辑了。自测完成后,提测,PM Review 效果。看完后,PM 提了个问题,这个动画效果范围能不能再大一点?PM 解释到按钮本身大小不是很大,会导致引导效果不够明显,也会导致用户的点击欲望不够。我想了想,似乎很有道理啊,但是这个能做到吗?答案是当然可以呢。如果单纯从现...

weixin_42502382的博客 2359

Android开发 动态添加view

Android开发:动态添加View 在Android开发中,我们经常需要根据用户的操作或者数据的变化来动态添加View,以提供更好的用户体验和功能交互。本文将介绍如何在Android应用中动态添加View,并提供代码示例进行说明。 为什么要动态添加View 动态添加View是为了实现灵活的界面布局和交互效果。通过动态添加...

weixin_36462703的博客 353

Android 如何在代码中动态的添加View 及 指定位置

一些要点 DecorView 是android 界面的顶级View ,当前界面的整个即为DecorView。DecorView为FrameLayout,而DecorVi...

binbinbintony的博客 943
上一篇: 安卓CameraX的使用
下一篇: 安卓延迟自动点击
java_t_t
博客等级 码龄9年 171粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值