当前位置: 首页 > news >正文

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# 匿名类

相关文章:

Xamarin.Android实现加载中的效果

目录 1、说明2、代码如下2.1 图1的代码2.1.1、创建一个Activity或者Fragment&#xff0c;如下&#xff1a;2.1.2、创建Layout2.1.3、如何使用 2.2 图2的代码 4、其他补充4.1 C#与Java中的匿名类4.2 、其他知识点 5、参考资料 1、说明 在实际使用过程中&#xff0c;常常会用到点…...

Leetcode.1559 二维网格图中探测环

题目链接 Leetcode.1559 二维网格图中探测环 rating : 1838 题目描述 给你一个二维字符网格数组 g r i d grid grid &#xff0c;大小为 m x n &#xff0c;你需要检查 g r i d grid grid 中是否存在 相同值 形成的环。 一个环是一条开始和结束于同一个格子的长度 大于等于…...

阿拉伯数字转中文数字字符,最高支持千京

直接上代码 UtilityClass public class NumberFormatUtil {/** 中文 -> 数字对应关系 */private static final Map<Character, Integer> DIGIT_CHINA new HashMap<>();/** 数字 -> 中文对应关系 */private static final Map<Integer, Character> DIGI…...

Python基础--序列操作/函数

Python基础 1.序列的操作 2.函数 1. 数据类型的具体操作 1.1 序列操作--列表具体操作&#xff1a; #定义列表 listA [] #定义一个空列表 listB [1,2.8,"你好",listA,[1,2,3]] # 访问列表 print(listB)#查看整个列表 print(listB[2])#查看单个…...

Kafka与Zookeeper版本对应关系

文章目录 了解版本对应Kafka安装包Kafka源码包 了解 比如&#xff1a; kafka_2.11-1.1.1.jar包 其中2.11表示的是Scala的版本&#xff0c;因为Kafka服务器端代码完全由Scala语音编写。”-“后面的1.1.1表示的kafka的版本信息。遵循一个基本原则&#xff0c;Kafka客户端版本和服…...

Arch Linux 使用桥接模式上网

如果我们想要将虚拟机与物理主机同一网段&#xff0c;并且像物理机器一样被其他设备访问&#xff0c;则需要以桥接模式上网&#xff0c;这个时候&#xff0c;物理主机就必须配置为使用网桥上网了。 注意&#xff1a;这里我们使用了 NetworkManager 网络管理工具中的 nmcli 来进…...

Vue 中使用 WebWorker

目录 安装 loader 应用场景 打包时错误处理 安装 loader npm install worker-loader -D 如果直接把worker.js放到public目录下&#xff0c;则不需要安装loader vue.config.js const { defineConfig } require(vue/cli-service)module.exports defineConfig({transpileDe…...

财务管理系统javaweb会计账房进销存jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 财务管理系统javaweb java,Struts2,bootstrap,mysql,…...

企业服务器被devos勒索病毒攻击后怎么处理,devos勒索病毒如何攻击的

众所周知&#xff0c;科学技术是第一生产力&#xff0c;科学技术的发展给企业与人们的生活带来了极大变化&#xff0c;但随之而来的网络安全威胁也不断增加。最近&#xff0c;我们收到很多企业的求助&#xff0c;企业的计算机服务器遭到了devos勒索病毒的攻击&#xff0c;导致企…...

React源码解析18(2)------ FilberNode,FilberRootNode结构关系

摘要 在上一篇&#xff0c;我们实现了通过JSX转换为ReactElement的方法&#xff0c;也看到了转换后React元素的结构。但是这个React元素&#xff0c;并不能很清楚的表达组件之间的关系&#xff0c;以及属性的处理。 所以在React内部&#xff0c;会将所有的React元素转换为Fil…...

什么是Session?它在SQLAlchemy中扮演什么角色?

让我们先来谈谈什么是“Session”。在你逛超市或者餐厅的时候&#xff0c;你可能会遇到一种叫做“前台”的东西。你知道那是干什么的吗&#xff1f;它是用来暂存你买的东西&#xff0c;这样你就可以从容地结账&#xff0c;而不必抱着满满一购物车的商品。 数据库的“Session”…...

Java 中 Set集合常用方法

.add() 添加元素 对象名.add() 向Set集合中添加元素 &#xff08;但不能添加重复元素&#xff0c;Set集合中不允许元素重复&#xff09; Set<String> s new HashSet<String>(); // 添加数据 s.add("aaa"); s.add("bbb"); addAll(Collectio…...

(MVC)SpringBoot+Mybatis+Mapper.xml

前言&#xff1a;本篇博客主要对MVC架构、Mybatis工程加深下理解&#xff0c;前面写过一篇博客&#xff1a;SprintBoothtml/css/jsmybatis的demo&#xff0c;里面涉及到了Mybatis的应用&#xff0c;此篇博客主要介绍一种将sql语句写到了配置文件里的方法&#xff0c;即Mybatis里…...

【Linux命令行与Shell脚本编程】第十九章 正则表达式

Linux命令行与Shell脚本编程 第十九章 正则表达式 文章目录 Linux命令行与Shell脚本编程 第十九章 正则表达式九.正则表达式9.1.正则表达式基础9.1.1.正则表达式的类型9.2.定义BRE模式9.2.1.普通文本9.2.2.特殊字符 9.2.3.锚点字符锚定行首^锚定行尾$组合锚点 9.2.4.点号字符\.…...

vue exceljs 实现导出excel并设置网格线、背景色、 垂直居中、分页打印

一、 下载 exceljs pnpm install exceljs二、 页面中使用 // 导出 exportExcelexportToExcel() {this.$confirm("此操作将导出excel文件, 是否继续?", "提示", {confirmButtonText: "确定",cancelButtonText: "取消",type: "wa…...

TC358774/5显示桥接(MIPI DSI到LVDS)

东芝TC358774/5显示桥针对使用带有MIPI DSI(显示串行接口)连接的主机处理器的手持设备进行了优化。tc358774 /5作为协议桥接&#xff0c;使视频数据流从主机处理器链接到驱动LVDS显示面板。tc358774 /5桥接器可以配置为多达4通道MIPI DSI&#xff0c;每通道数据速率高达1 Gbps&…...

企业内部FAQ常见问题展示分享的价值

企业内部FAQ&#xff08;常见问题&#xff09;展示分享是一种将常见问题和解决方案以问答形式呈现给员工的方式。这种方式可以帮助企业提高工作效率、提供一致的解决方案、提升员工满意度和减少重复工作。 企业内部FAQ常见问题展示分享的价值&#xff1a; 1. 提高工作效率 企…...

React 核心开发者 Dan Abramov 宣布从 Meta 离职

导读React.js 核心开发者、Redux 作者 Dan Abramov 在社交平台发文宣布&#xff0c;将辞去在 Meta 的职务&#xff1a; “我感到苦乐参半&#xff0c;几周后我就要辞去 Meta 的工作了。在 Meta 的 React 组织工作是我的荣幸。感谢我过去和现在的同事接纳我&#xff0c;容忍我犯…...

【C/C++】std::vector 优化点(官方同步)

预分配空间&#xff1a;使用 reserve() 方法预分配 vector 的空间&#xff0c;避免频繁的内存分配和拷贝操作。 使用 emplace_back()&#xff1a;使用 emplace_back() 方法插入元素&#xff0c;避免了拷贝构造函数的调用&#xff0c;提高了插入效率。 使用移动语义&#xff1…...

【vue3】elementPlus主题色定制

以scss语言为例 1、element-plus自动按需导入配置&#xff0c;可参考官网按需导入模块 安装element-plus及辅助插件 npm i element-plus --save安装辅助插件 npm install -D unplugin-vue-components unplugin-auto-import安装sass npm i sass -D2、vite.config.js 中配置…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...