Xamarin.Android实现加载中的效果

目录

  • 1、说明
  • 2、代码如下
    • 2.1 图1的代码
      • 2.1.1、创建一个`Activity`或者`Fragment`,如下:
      • 2.1.2、创建`Layout`
      • 2.1.3、如何使用
    • 2.2 图2的代码
  • 4、其他补充
    • 4.1 C#与Java中的匿名类
    • 4.2 、其他知识点
  • 5、参考资料

1、说明

在实际使用过程中,常常会用到点击按钮后,系统弹出加载中画面的需求,因此整理了一下Xamarin.Android中实现加载的功能,效果如下:
在这里插入图片描述 在这里插入图片描述

2、代码如下

2.1 图1的代码

2.1.1、创建一个Activity或者Fragment,如下:

public class BaseAcitivity : Activity, IDialogInterfaceOnKeyListener
{public Android.App.AlertDialog alertDialog;protected override void OnCreate(Bundle savedInstanceState){base.OnCreate(savedInstanceState);}//展示对话框public void showLoadingDialog(){alertDialog = new Android.App.AlertDialog.Builder(this).Create();;alertDialog.Window.SetBackgroundDrawable(new ColorDrawable());alertDialog.SetCancelable(false);alertDialog.SetOnKeyListener(this);alertDialog.Show();alertDialog.Window.SetLayout(300, 300);alertDialog.SetContentView(Resource.Layout.loading_alert);alertDialog.SetCanceledOnTouchOutside(false);}//退出对话框public void dismissLoadingDialog(){if (null != alertDialog && alertDialog.IsShowing){alertDialog.Dismiss();}}//监听事件,主要是防止系统监听返回事件---悄无声息得把对话框给干没了public bool OnKey(IDialogInterface? dialog, [GeneratedEnum] Keycode keyCode, KeyEvent? e){//这儿主要是防止系统监听搜索或返回事件,造成弹框被取消if (keyCode == Keycode.Search || keyCode == Keycode.Back){return true;}else{return false;}}
}

Fragment同理

public class BaseFragment : AndroidX.Fragment.App.Fragment, IDialogInterfaceOnKeyListener
{private Android.App.AlertDialog alertDialog;public void showLoadingDialog(){alertDialog = new Android.App.AlertDialog.Builder(this.Context).Create();;alertDialog.Window.SetBackgroundDrawable(new ColorDrawable());alertDialog.SetCancelable(false);alertDialog.SetOnKeyListener(this);alertDialog.Show();alertDialog.Window.SetLayout(300, 300);alertDialog.SetContentView(Resource.Layout.loading_alert);alertDialog.SetCanceledOnTouchOutside(false);}public void dismissLoadingDialog(){if (null != alertDialog && alertDialog.IsShowing){alertDialog.Dismiss();}}public bool OnKey(IDialogInterface? dialog, [GeneratedEnum] Keycode keyCode, KeyEvent? e){if (keyCode == Keycode.Search || keyCode == Keycode.Back){return true;}else{return false;}}}

2.1.2、创建Layout

Resource.Layout.loading_alert,代码如下:

<?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:gravity="center"android:background="#000"><ProgressBarandroid:id="@+id/progressBar1"android:layout_width="40dp"android:layout_height="40dp"android:layout_centerHorizontal="true"android:layout_centerVertical="true"android:layout_gravity="center_horizontal"style="@style/AppTheme.NoActionBar"/><TextViewandroid:text="加载中..."android:textAppearance="?android:attr/textAppearanceSmall"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textColor="@android:color/white"android:id="@+id/textView1" /></LinearLayout>

代码比较简单,只不过在ProgressBar用到了一个style,—AppTheme.NoActionBar。其代码如下:

<style name="AppTheme.NoActionBar"><item name="android:windowActionBar">false</item><item name="android:windowNoTitle">true</item>
</style>

2.1.3、如何使用

创建一个新的Activity或者Fragment时,继承上面的两个基类
例如:

public class MineFragment : BaseFragment

然后在子类中直接使用:

private void DataUpdateBtn_Click(object sender, EventArgs e)
{base.showLoadingDialog();Task.Factory.StartNew(() => {//同步字典数据//具体业务操作代码//TO-DO//关闭对话框base.dismissLoadingDialog();});
}

即可实现

2.2 图2的代码

相比较图1,图2在具体实现上基本没有差别,仅有的差别就是在Layout上,图2的Layout如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:padding="10dp"android:layout_width="110dp"android:layout_height="110dp"android:background="@drawable/corners_bg"  <!--差别1:主要是实现了圆角-->android:gravity="center"android:orientation="vertical" ><ProgressBarandroid:id="@+id/progressBar1"android:layout_width="35dp"android:layout_height="35dp"android:layout_gravity="center_horizontal"android:indeterminateBehavior="cycle"android:indeterminateDrawable="@drawable/dialog_loading"   <!--差别2:使用了自定义的图片-->android:indeterminateOnly="true" /><TextViewandroid:id="@+id/tipTextView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="15dp"android:text="加载中..."android:textColor="#f0f0f0"android:textSize="15sp" /></LinearLayout>

corners_bg.xml定义如下:
主要是实现圆角功能

<?xml version="1.0" encoding="utf-8" ?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><solid android:color="#000" /><corners android:topLeftRadius="10dp"android:topRightRadius="10dp"android:bottomRightRadius="10dp"android:bottomLeftRadius="10dp"/>
</shape>

dialog_loading.xml定义如下:

<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"android:drawable="@mipmap/loading"android:pivotX="50%"android:pivotY="50%" />

主要是使用了自定义的图片,以及图片旋转时的参数

4、其他补充

4.1 C#与Java中的匿名类

在网上的例子中,常常可以看到如下的代码:

alertDialog.setOnKeyListener(new DialogInterface.OnKeyListener() {@Overridepublic boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_SEARCH || keyCode == KeyEvent.KEYCODE_BACK)return true;return false;}
});

这是Java中常见的写法,在匿名类中实现方法。但这种方式无法在C#中实现,因为C#的匿名类中只能包含字段(field),C#的匿名类型是由一个或多个公共只读属性组成的类类型。 不允许包含其他种类的类成员(如方法或事件)。 匿名类型不能强制转换为除 object 以外的任何接口或类型。

官网的说明如下:

Anonymous types contain one or more public read-only properties. No other kinds of class members, such as methods or events, are valid.
It is also possible to define a field by object of another type: class, struct or even another anonymous type.

为啥Java可以,C#不可以呢。主要原因就是C#有委托(delegate)。 因此,在Java中,如果我们想实现事件机制或者传一个方法,一般是使用接口。那么定义一个类去实现接口是多么麻烦的事情。 你在Java中能看到大量的只有一个方法的接口,比如Runnable。 而C#已经有了匿名委托了,使用委托比使用接口更简单,没必要再画蛇添足了。 事实上Java饶了弯路,它们现在也开始支持Lambda表达式,而且还不得不出于兼容的考虑,创造了一个雌雄同体的怪异语法约定——那种只有一个方法的接口,可以用Lambda表达式表示

4.2 、其他知识点

在整个过程中,用到的知识就是ProgressBarHandler接口

5、参考资料

1、Android最简单的LoadingDialog
2、C# 匿名类

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

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

相关文章

【ChatGPT辅助学Rust | 基础系列 | 基础语法】变量,数据类型,运算符,控制流

文章目录 简介&#xff1a;一&#xff0c;变量1&#xff0c;变量的定义2&#xff0c;变量的可变性3&#xff0c;变量的隐藏 二、数据类型1&#xff0c;标量类型2&#xff0c;复合类型 三&#xff0c;运算符1&#xff0c;算术运算符2&#xff0c;比较运算符3&#xff0c;逻辑运算…

python_在K线找出波段_01_找出所有转折点

目录 写在前面&#xff1a; 需要考虑的几种K线图情况&#xff1a; 寻找所有转折点逻辑&#xff1a; 代码&#xff1a; 寻找转折点方法&#xff1a;找到第一个转折点就返回 循环寻找峰谷方法 主方法 调用计算&#xff1a; 返回&#xff1a; 在【PyQt5开发验证K线视觉想…

数字图像处理(番外)图像增强

图像增强 图像增强的方法是通过一定手段对原图像附加一些信息或变换数据&#xff0c;有选择地突出图像中感兴趣的特征或者抑制(掩盖)图像中某些不需要的特征&#xff0c;使图像与视觉响应特性相匹配。 图像对比度 图像对比度计算方式如下&#xff1a; C ∑ δ δ ( i , j …

7 网络通信(上)

文章目录 网络通信概述ip地址ip的作用ip地址的分类私有ip 掩码和广播地址 linux 命令&#xff08;ping ifconfig&#xff09;查看或配置网卡信息&#xff1a;ifconfig(widows 用ipconfig)测试远程主机连通性&#xff1a;ping路由查看 端口端口是怎样分配的知名端口动态端口 查看…

合宙Air724UG LuatOS-Air script lib API--log

Table of Contents log _log(level, tag, …) (local函数 无法被外部调用) log.trace(tag, …) log.debug(tag, …) log.info(tag, …) log.warn(tag, …) log.error(tag, …) log.fatal(tag, …) log.openTrace(v, uartid, baudrate) log 模块功能&#xff1a;系统日志记录,分…

【数据结构与算法】基数排序

基数排序 基数排序&#xff08;Radix Sort&#xff09;属于“分配式排序”&#xff0c;又称“桶子法”或 bin sort&#xff0c;顾名思义&#xff0c;它是通过键值的各个位的值&#xff0c;将要排序的元素分配至某些“桶”中&#xff0c;达到排序的作用。基数排序法是属于稳定性…

【C++】开源:Boost网络库Asio配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Asio网络库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次…

信息安全战线左移!智能网联汽车安全亟需“治未病”

当汽车由典型的工业机械产品逐步发展成为全新的智能移动终端&#xff0c;汽车的安全边界发生了根本性改变&#xff0c;信息安全风险和挑战不断增加。 面对复杂的异构网络、异构系统及车规级特异性要求&#xff0c;智能智能网联汽车信息安全到底要如何防护&#xff0c;已经成为…

qml中,在ListView中添加滚轮无法展现最后几行数据的问题解决

这个是我困扰我数几个小时的问题&#xff0c;好不容易知道了如何在LIstView中添加滚轮&#xff0c;然而&#xff0c;当我鼠标滚轮到最后的时候&#xff0c;展现的总不是最后那几行数据&#xff0c;这真的很让人头大&#xff0c;还好有了这次经历&#xff0c;把这个问题记录下来…

八大排序算法--选择排序(动图理解)

选择排序 算法思路 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的数据元素排完 。 选择排序的步骤&#xff1a; 1>首先在未排序序列中找到最小&#xff08;大&#xff09;元素…

Redis五大基础类型解析

1.String类型 特征&#xff1a;即存储字符串的类型&#xff0c;单个字符串存储量最大不超过512MB 常用业务场景&#xff1a;⽤来存储JSON序列化之后对象 底层编码&#xff1a; int编码 数据结构特点&#xff1a;ptr指针直接指向字符串常量池中对应字符串地址&#xff0c;而…

基于vue+uniapp微信小程序公司企业后勤服务(设备)系统

本系统分为用户和管理员两个角色&#xff0c;其中用户可以注册登陆系统&#xff0c;查看公司公告&#xff0c;查看设备&#xff0c;设备入库&#xff0c;查看通讯录&#xff0c;会议室预约&#xff0c;申请出入&#xff0c;申请请假等功能。管理员可以对员工信息&#xff0c;会…

从 0 到 1!得物如何打造通用大模型训练和推理平台

1.背景 近期&#xff0c;GPT 大模型的发布给自然语言处理&#xff08;NLP&#xff09;领域带来了令人震撼的体验。随着这一事件的发生&#xff0c;一系列开源大模型也迅速崛起。依据一些评估机构的评估&#xff0c;这些开源模型大模型的表现也相当不错。一些大模型的评测情况可…

std vector 用法

使用vector&#xff0c;需添加头文件#include&#xff0c;要使用sort或find&#xff0c;则需要添加头文件#include。函数封装在命名空间std中&#xff0c;使用&#xff1a;using namespace std; 1、vector的初始化 std::vector<int> nVec;    // 空对象 std::vecto…

【Eigen 1】Eigen中的norm、normalize、normalized三者对比

一、norm() 1. 对于Vector&#xff0c;norm返回的是向量的二范数 即: ∣ ∣ x ∣ ∣ 2 ∑ i 1 N x i 2 ||x||_2 \sqrt{\sum_{i1}^{N} {x}^{2}_{i} } ∣∣x∣∣2​i1∑N​xi2​ ​ Vector2d vec(3.0,4.0); cout << vec.norm() << endl; /输出52. 对于Matrix&…

redis常见面试汇总

目录 Redis 适合的场景 Redis 不适合的场景 3、Redis 有哪些常见的功能&#xff1f; 什么是缓存穿透&#xff1f;怎么解决&#xff1f; 什么是缓存雪崩&#xff1f;该如何解决&#xff1f; 参考文献&#xff1a; Redis 适合的场景 缓存&#xff1a;减轻 MySQL 的查询压力…

matlab多线程,parfor循环进度,matlab互斥锁

一. 内容简介 matlab多线程&#xff0c;parfor循环进度&#xff0c;matlab互斥锁 二. 软件环境 2.1 matlab 2022b 2.2代码链接 https://gitee.com/JJW_1601897441/csdn 三.主要流程 3.1 matlab多线程 有好几种&#xff0c;最简单的&#xff0c;最好理解的就是parfor&am…

不可错过的家装服务预约小程序商城开发指南

在当今社会&#xff0c;家装行业发展迅速&#xff0c;越来越多的人开始寻求专业的家装预约和咨询服务。对于不懂技术的新手来说&#xff0c;创建一个自己的家装预约咨询平台可能听起来很困难&#xff0c;但实际上通过一些第三方制作平台和工具&#xff0c;这个过程可以变得简单…

ARM 循环阻塞延迟函数

串行驱动的关键是双方能够按照既定的时序进行检测、设置相关引脚上的电平&#xff0c;比如单总线、I2c这样基本的可以用GPIO模拟的时序协议&#xff0c;需要主从双方&#xff0c;必须在链路接口内严格按照微妙级的延迟单位进行时序同步。 所以&#xff0c;在这种对时间要求很敏…

C++引用

1 引用的基本使用 作用&#xff1a; 给变量起别名 语法&#xff1a; 数据类型 &别名 原名 示例&#xff1a; int main() {int a 10;int &b a;cout << "a " << a << endl;cout << "b " << b << endl;…