更好用的DialogFragment

Android Dialog:Dialog和DialogFragment的区别?DialogFragment如何使用?源码解析 Dialog在创建时会关联一个Context(上下文),并通过这个Context获取WindowManager服务,进而与WindowManager绑定,实现窗口的添加和管理。如果onCreateDialog不传递一个新的dialog,那么就会使用默认的,而布局,就是从onCreateView里面取,也就是requireView方法。Dialog是Android中用于显示一个浮动窗口的类,这个窗口会覆盖在当前的活动(Activity)或应用程序的顶部。我们可以看一下Dialog的源码。 阅读详情
工作中总是要用到各式各样的对话框,通常我们首先会想到的就是Dialog。在以前的时候我通常都会自定义一个Dialog,然后在里面写一个接口,让需要创建这个Dialog的界面继承这个接口,实现点击事件的监听。其中大概代码是这样的:
/**
 * @date 创建时间: 2017/11/22  22:25
 * @author zh_legendd
 * @Description 自定义的dialog
 * @Email code_legend@163.com
 * @Version 1.0
 */
public class SureExitDialog extends Dialog {


    private Button btn_cancel, btn_sure;

    private SureListener mSureListener;



    public interface SureListener {
        void sureExit();
    }

    public void setSureListener(SureListener mSureListener){
        this.mSureListener=mSureListener;
    }

    public SureExitDialog(Context context) {
        super(context, R.style.PayDialog);
        initWindow();
        show();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_dialog);
        btn_sure = (Button) findViewById(R.id.btn_sure);
        btn_cancel = (Button) findViewById(R.id.btn_cancel);
        btn_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dismiss();
            }
        });
        btn_sure.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mSureListener.sureExit();
                dismiss();
            }
        });
    }

    /**
     * 初始化window参数
     */
    private void initWindow() {
        Window dialogWindow = getWindow();
        dialogWindow.getDecorView().setPadding(0, 0, 0, 0);
                dialogWindow.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        dialogWindow.setBackgroundDrawableResource(android.R.color.transparent);
                        dialogWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
        WindowManager.LayoutParams lp = dialogWindow.getAttributes();
        lp.width = WindowManager.LayoutParams.MATCH_PARENT;
        lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
        lp.gravity = Gravity.CENTER;
        dialogWindow.setAttributes(lp);
    }
}
  • 其实感觉这样写也并没有什么不好的,以前我也看到过其他人写的文章说现在官方推荐使用DialogFragment,但是看了几篇文章并没有感觉有多好用。直到我看了《Android编程权威指南》之后,我觉得真的有必要的使用一下DialogFragment了。现在基本上都会在Activity里面放很多fragment。因此接下来我们要做的一个DialogFragment的场景也是在镶嵌到Activity的Fragment中调起的Fragment的并且不通过设置接口来传递数据,而是通过Fragment中特有的属性设置Tag,来辨别不同的Fragment(这也许就是DialogFragment的精华所在吧),take is cheap show me the code。
  • 首先创建一个承载Fragment的Activity
/**
 * @date 创建时间: 2017/11/22 0022 22:32
 * @author zh_legendd
 * @Description 承载Fragment的Activity
 * @Email code_legend@163.com
 * @Version 1.0
 */
public class FDActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fd);
       //替换fragment
        initView();
    }
    public void initView(){
        FragmentManager supportFragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = supportFragmentManager.beginTransaction();
        transaction.add(R.id.fl_context,TrFragment.newInstance());
        transaction.commit();
//        transaction.add()
    }
}
  • 然后创建一个镶嵌在Activity里面的Fragment,在这个Fragment的布局中只有一个按钮所以就不贴布局的代码了,一会可以看源码。这里注意的主要有两点:
    • 1 调起DialogFragment :因为DialogFragment的父类也是Fragment,所以我们首先也是需要得到FragmentManager ,但是又有和Fragment不同的是显示DialogFragment的时候需要调用show方法。在这里还需要设置一个返回值的tag,用于在onActivityResult回调的时候得到DialogFragment回传过来的信息。相当与我们自定义的Dialog中使用接口一样。但是后面的show方法里面的Tag好像是现在没有什么用。
    • 2 一般情况下我们调起Dialog无非就是一些提示语,然后让用户选择确认或者取消。接下来说的就是在DialogFragment中当用户点击确定或取消之后,怎么回传用户行为,我想看过上面一段话肯定就已经知道了,那就是在onActivityResult中进行。
    • 3 在DialogFragment中并没有设置接口监听,却能在Fragment直接相互传递数据主要还是应用的我上一篇讲的在onActivityResult中进行回调。
    • 4 因为在Fragment中调起DialogFragment的时候,Fragment中有一个可以设置Tag的属性,所以不需要设置回调监听,直接使用onActivityResult回调监听就可以。但是在Activity就不同了,反正我是找了好久,就必须要设置接口监听。
/**
 * @date 创建时间: 2017/11/22 0022 22:34
 * @author zh_legendd
 * @Description 镶嵌在Activity的Fragment
 * @Email code_legend@163.com
 * @Version 1.0
 */
public class TrFragment extends Fragment {

    private static final int REQUEST_DATE=0;
    //fragment的TAG
    private static final String DIALOG_DATE="DialogDate";

    private Button bt_jump;

    public static TrFragment newInstance(){
        //fargment与Activity之间传递数据
//        Bundle args =new Bundle();
//        args.putString();
        TrFragment trFragment=new TrFragment();
//        trFragment.setArguments(args);
        return trFragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View inflate = inflater.inflate(R.layout.fragment_tr, null);

        bt_jump=(Button)inflate.findViewById(R.id.bt_jump);
        bt_jump.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                MyToast.showText("点击了");
                FragmentManager fragmentManager = getFragmentManager();
                TestDialogFragment dialog = TestDialogFragment.newInstance("test");
                dialog.setTargetFragment(TrFragment.this,REQUEST_DATE);
                dialog.show(fragmentManager,DIALOG_DATE);
            }
        });

        return inflate;
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(resultCode!= Activity.RESULT_OK){
            return;
        }
        if(requestCode==REQUEST_DATE){
            MyToast.showText(data.getStringExtra(TestDialogFragment.EXTRA_STR));
        }
    }
}
  • 接下来就是在我们的DialogFragment中让我们正式的显示自己想要样式的Dialog。自定义的话,当时我心里面是有二个疑惑的首先就是怎么设置样式,然后就是怎么设置布局:
    • 第一个疑惑:这可能是有点麻烦了,需要谷歌一下。最后被我找到了,只要在这里设置属性就OK,这样你的DialogFragment就可以引用自定义的样式了。
@Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(STYLE_NO_TITLE,R.style.PayDialog);
    }
  • 第二个的话,很多文章里面都写的有直接在onCreateView里面设置布局就可以,当然自定义的话需要把标题给去掉,只用调用这一句方法就行getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);然后在onStart方法里面设置就像我们自定义的Dialog一样初始化window,就这么简单就可以实现和自定义Dialog一样的布局了。
/**
 * @date 创建时间: 2017/11/22 0022 22:44
 * @author zh_legendd
 * @Description 在DialogFragment布局
 * @Email code_legend@163.com
 * @Version 1.0
 */
public class TestDialogFragment extends DialogFragment {

    private static final String ARG_TEST="test";

    public  static final String EXTRA_STR="extra_str";


    private Button btn_cancel, btn_sure;

    public static TestDialogFragment newInstance(String str){
        Bundle bundle=new Bundle();
        bundle.putString(ARG_TEST,str);
        TestDialogFragment testDialogFragment=new TestDialogFragment();
        testDialogFragment.setArguments(bundle);
        return testDialogFragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(STYLE_NO_TITLE,R.style.PayDialog);
    }
     @Override
    public void onStart() {
        super.onStart();
        initWindow();

    }
    /**
     * 初始化window参数
     */
    private void initWindow() {
        Window dialogWindow = getDialog().getWindow();
        dialogWindow.getDecorView().setPadding(0, 0, 0, 0);
        dialogWindow.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        dialogWindow.setBackgroundDrawableResource(android.R.color.transparent);
        dialogWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
        WindowManager.LayoutParams lp = dialogWindow.getAttributes();
        lp.width = WindowManager.LayoutParams.MATCH_PARENT;
        lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
        lp.gravity= Gravity.CENTER;
        dialogWindow.setAttributes(lp);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);

        View inflate = inflater.inflate(R.layout.fragment_dialog, null);
        btn_sure = (Button) inflate.findViewById(R.id.btn_sure);
        btn_cancel = (Button) inflate.findViewById(R.id.btn_cancel);
        btn_sure.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendResult(Activity.RESULT_OK,"str");
            }
        });
        return inflate;
    }


    private void sendResult(int resultCode,String str){
        if(getTargetFragment()==null){
            return;
        }
        Intent intent=new Intent();
        intent.putExtra(EXTRA_STR,str);
        getTargetFragment().onActivityResult(getTargetRequestCode(),resultCode,intent);
    }


}
总结一下,我感觉DialogFragment中主要有两点相对应Dialog来说有点难。第一个是数据传递,第二个就自定义布局。感觉我上面说的还比较清楚吧(┬_┬)。Demo下载地址

DialogFragment

Creo模型装配总结 creo7.0的零件装配操作方法,建立基准面、新建约束、约束顺序 阅读详情

相关推荐

从零到一:AIGC+Unity3D打造动态天空盒的实战指南

本文详细介绍了如何利用AIGC技术结合Unity3D打造动态天空盒的实战指南。通过AIGC生成360全景图,再集成到Unity3D中,实现高效、多样化的天空盒效果。文章涵盖了从AIGC全景图生成、工作流搭建到Unity场景集成的完整流程,并提供了代码示例和优化建议,帮助开发者快速掌握这一技术。

weixin_29021291的博客 604

自定义dialog的方式,以及需要注意事项

上一次总结记录了dialog的载体是什么(window),在某种情况下setContentView会重置LayoutParams导致我们之前设置好的LayoutParams无效,为什么dialog依赖于activity; 这次总结一下自定义dialog的一些方式,以及需要注意的一些事项,好吧下面就来记录一下自定义dialog的方式: 方式一:public static AlertDialog s

风_z 1102

从零到英雄:Spring Boot 微服务架构全攻略

在数字化转型的时代,微服务架构已成为构建可扩展、高可用系统的首选方案。本文以“从零到英雄”为主题,详细指导读者使用Spring Boot快速构建微服务帝国。从基础环境搭建入手,逐步深入到服务发现、配置管理、负载均衡、断路器、API网关、安全认证、监控与部署等核心模块。通过大量代码示例和详细解释,包括中文注释,帮助初学者和中级开发者掌握Spring Boot的核心概念和技术实践。文章强调实际操作,涵盖RESTful API开发、数据库集成、容器化部署等内容,并讨论常见问题与优化策略。无论你是Java开发者还是

一个被知识诅咒的人 2701

【Android】文本输入框弹出的同时软键盘也弹出,不需要点击两次才弹出软键盘window.setSoftInputMode解决

在项目手机中,点击某个view弹出一个包含editText和发送组件的Dialog。

weixin_44002043的博客 747

IEEE PHM 2012轴承数据实战:用LSTM预测剩余寿命的完整流程与调参心得

本文详细解析了如何利用IEEE PHM 2012轴承数据集和LSTM模型进行轴承剩余寿命预测。从数据预处理、特征工程到LSTM模型架构设计和调参技巧,提供了完整的实战流程。特别分享了FEMTO-ST数据集的处理方法、RUL标签构建策略以及提升预测精度的关键技巧,帮助工程师实现更准确的预测性维护。

weixin_31100517的博客 368

手把手教你用Microsoft AEC Challenge数据集训练自己的回声消除模型(附完整代码)

本文详细介绍了如何使用Microsoft AEC Challenge数据集训练专业的回声消除模型,包括环境准备、数据清洗、模型架构设计、训练流程和实际部署注意事项。通过完整的代码示例和实战指南,帮助开发者快速掌握AEC技术,提升语音通信系统的回声消除效果。

weixin_27697385的博客 460

Dialog定制

[b]定制dialog的方式[/b] 1. 可以通过Theme的方式,android默认也提供了一些Window的Theme来给我们使用,如:android.R.style.Theme_NoTitleBar(不显示title bar),android.R.style.Theme_NoTitleBar_Fullscreen(全屏)。 2. 通过设置Window类的一些属性来定制 如果要看源...

iteye_20037的博客 288

edusrc挖掘思路

edusrc挖掘思路前言思路信息搜集系统账号常见漏洞实战分享1、确定目标,语法:site:xxxx.edu.cn2、账号密码组成我们知道了,谷歌语法查找工号3、爆破登录系统4、确定功能,抓具体的url5、添加单引号,报错,是mssql6、报数据库版本,到这一步就可以交了,已经是中危了后记 前言 一月份的时候偶然注意到edusrc,起初是抱着学习的心态去挖几个洞,可是后面发现有证书,而且还贼好看,于是我动了凡心,一顿操作也拿了几本,广西民大、山东理工、同济,未到的有浙大、上海理工,证书要求证书图片可以在我个人

qq_45414878的博客 2万+

关于dialog显示全屏和正常问题解决

最近项目,需要用到 dialog 使用dialog 的时候却发现dialog全屏显示了, 才发现我这边的宽高参数设置成了 dialog.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); 最后改成 Window dialogWindow = dialog.getWindow(); dialogWindow.

weixin_43675653的博客 1651

【OpenClaw从入门到精通】第12篇:OpenClaw 2026子代理实战全攻略:用ACP架构搭建多智能体协作网络(附完整代码)

本文聚焦OpenClaw 2026.3.2版本默认启用的ACP(Agent Communication Protocol)子代理机制,从核心概念、底层原理到企业级实操全流程拆解。先解析子代理的定义、ACP协议通信原理及主从代理分工逻辑,再提供环境准备的详细步骤(版本验证、配置调整、技能安装);随后通过三个递进式虚拟案例(客服分流、智能文档处理、企业级招聘全流程),提供可直接运行的完整代码、执行结果及技术要点解析;最后补充子代理管理运维、性能优化与避坑指南。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2384

CPD (Coherent Point Drift) 算法实现点云配准 C++版

作为和icp并列的点集配准算法cpd为什么没有icp火,等我把整个方案跑完才明白。 首先下载cpd https://github.com/gadomski/cpd 包含的fgt https://github.com/gadomski/fgt 下载到win10的解压后 运行cmake来进行编译 这个时候会提醒缺少eigen3 fgt python 这几个都安装排除后 在build文件夹下会生成vs2017的源码,右键全部生成后在 .\cpd-master\build\Debug 下会生成一个cpd.li

uranus1992的博客 3510

dialog的使用 包括FLAG_DIM_BEHIND 和dimAmount的使用

首先自定义一个类,集成自dialog类。 设置透明度,主要设置的是dialog自身的透明度 Java代码   WindowManager.LayoutParams lp=dialog.getWindow().getAttributes();

ooo4561213的专栏 3万+

“华为杯”研究生数学建模竞赛2020年-【华为杯】B题:汽油辛烷值优化建模(附优秀论文)

摘 要:本文通过机器学习算法和数据挖掘技术,建立了汽油辛烷值(RON)损失的预测模型,在保证汽油产品脱硫效果的前提下,以降低汽油辛烷值损失在30%以上为目标,给出每个样本的优化操作条件。针对第一问,对285号和313号原始数据用给定的数据处理规范进行预处理,对每一列变量求期望,得到最终的数据补充到相应的样本编号。针对第二问,首先对数据样本按照最大最小限幅以及拉依达法则进行列变量清洗,通过两轮特征筛选确定变量:结合处理后的数据,针对产品中硫含量、RON损失值用。

getusushu的博客 1251

Android为啥推荐用DialogFragment创建Dialog?

前言:这段时候有点忙,因为再敢需求,说忙也都是在敷衍,时间挤挤还是有的,从开始写博客的那一刻起就应该一直坚持下来,不要三天打鱼两天晒网,上次写过一个Android进阶之(dialog详解一),今天继续上次的内容探究一下,从Android3.0后Android引入的DailogFragment,我们一起从源码的角度去看看为啥谷歌推荐这样创建Dialog. DialogFragment对话框出现的意义

vv_bug 6742

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

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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Android之DialogFragment

DialogFragment是基于Fragment展示Dialog的窗口。对话框的控制(何时隐藏、显示、关闭)通过对应的Dialogment 的API来完成,而不是Dialog的API.          DialogFragment需要保证Fragment和Dialog的状态保持一致。它监听dialog的dissmiss event,并且去处理自己的状态。这意味着应该调用 show(Fra

行云间 1265

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

DialogFragment监听back键和设置宽高

implements AddressManagerView , DialogInterface.OnKeyListener { @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInst...

lidongxiu0714 2827

jre9下载 jdk9

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

Android DialogFragment

转载自https://blog.youkuaiyun.com/androidstarjack/article/details/73824885最近学习弹框时发现有三种类型的可供使用, PopupWindow、dialog,DialogFragment。比如说需求:只拦截自身所占空间部分的事件,其余空间的点击事件不处理可以根据改变View的布局排列方式,View是否设置底部背景及居中方式虽然在功能上 Popup...

qq_36523667的博客 832

Dialog, DialogFragment, PopupWindow比较

随着Fragment这个类的引 入,Google官方推荐大家使用DialogFragment来代替传统的Dialog.1,AlertDialog与DialogFragmentbefore:AlertDialog dialog = new AlertDialog.Builder(this) .setTitle("Dialog") .setMessage("thisis a dialog

TTKatrina的博客 3135

DialogFragment使用及总结

DialogFragment使用总结 介绍 DialogFragment在android 3.0时被引入。是一种特殊的Fragment。在DialogFragment产生之前,我们创建对话框:一般采用AlertDialog和Dialog。注:官方不推荐直接使用Dialog创建对话框。 优势在哪里 使用DialogFragment来管理对话框,当旋转屏幕和按下后退键时可以更好的管理...

CoderThc 968

DialogFragment你值得拥用

最近写了一个弹框,发现之前写弹窗方式。 dialog PopupWindow 因为Android 官方推荐使用 DialogFragment,所以就尝试了一下,简直不要太好啊。 DialogFragment是基于Fragment实现的。 public class ShareGiftBag extends DialogFragment implements View.OnClickListene...

jhonjson的博客 168

Android使用DialogFragment创建对话框

目录目录 概述 DialogFragment 重写onCreateView来创建Dialog 重写onCreateDialog创建Dialog 与Activity进行通信 参考链接概述DialogFragment是在Android 3.0时引入的,是一种特殊的Fragment,用于在Activity的内容之上展示一个模拟的对话框。例如,用于展示一个警示框、密码框等。在DialogFragment之前

小一的专栏 6018

Activity与DialogFragment交互的方法

好久没有更新博客了,今天我们来讨论一下如何在Activity与DialogFragment交互的方法,这里包括了DialogFragment的启动以及Activity方法的调用。 DialogFragment与Dialog相比类似,是官方现在更建议使用的Dialog。 DialogFragment的定义 新建一个DialogFragment,该类继承DialogFragment。复写onCre

编程二三事 5859

DialogFragment笔记

转载借鉴:https://www.imooc.com/article/21577 1、 Android官方推荐使用DialogFragment创建对话框,在android3.0时被引用。是一种特殊的Fragment,用于在Activity的内容上展示一个对话框。 2、DialogFragment有着Dialog没有的非常好的特性 (1)它本身是Fragment的子类,有着和Fragment基本一样...

meng_ff的博客 188

简单好用的自定义DialogFragment

现在有了DialogFragment,所有原来的Dialog就不要使用了。DialogFragment方便又好用,而且屏幕旋转的时候还会保持。下面我简单封装了一个DialogFragment,供自己使用,给大家参考。 没有重写onCreateDialog,因为重写onCreateDialog不能很好的适配圆角(圆角dialog使用还是很多的)。采用的是重写onCreatView,在该方法里ret

qq_30899223的博客 757

Android:自定义DialogFragment

DialogFragmentDialogFragment是在Android3.0的时候被引入的,从其名字可以很直观的看出它是一种基于Fragment的Dialog,可以用来创建对话框,它是用来替代Dialog的。一个新事物的出现是为了解决旧事物存在的问题,那不建议使用的Dialog存在什么问题呢?下面简单的说下。Dialog存在问题 在手机配置发生变化后(比如:旋屏后),变化之前显示的Dialog,

Dream It Possible 3989

使用 DialogFragment 创建对话框

简介在DialogFragment产生之前,我们创建对话框一般采用AlertDialog和Dialog,DialogFragment在android 3.0时被引入,是一种特殊的Fragment,用于在Activity的内容之上展示一个模态的对话框。使用DialogFragment来管理对话框,当旋转屏幕和按下后退键时可以更好的管理其生命周期(自动重建),它和Fragment有着基本一致的生命周期...

weixin_33810302的博客 156
上一篇: Activity数据传递详解
下一篇: 打造一个通用的TitleView
Code_legend
博客等级 码龄10年 33粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值