Xamarin.Andorid实现界面弹框

news2025/1/17 0:19:48

目录

  • 1、使用系统自带的样式
    • 1.1 具体实现
    • 1.2 效果
  • 2、自定义样式的实现
    • 2.1 预期效果
    • 2.2 具体实现
    • 2.3 相关知识
  • 3 代码下载
  • 4、参考

在App的实际使用中,一定会出现弹框选择的情况。如图所示:
图片样式
因此非常有必须学会及使用弹框的功能,因此本次学习Xamarin.Andorid下面的弹框。下面是代码说明

1、使用系统自带的样式

1.1 具体实现

这个是最简单的,其效果就是最开始展示的效果图片的,效果还是很不错,建议使用此方式。其代码如下,

[Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
public class MainActivity : AppCompatActivity
{
   private Button diaLogBtn, selfDefineBtn;//界面上的button,调用不用的dialog
   private Android.App.AlertDialog alertDialog = null;
   private Android.App.AlertDialog.Builder builder = null;

   private EditText name, inputtype;
   protected override void OnCreate(Bundle savedInstanceState)
   {
       base.OnCreate(savedInstanceState);
       Xamarin.Essentials.Platform.Init(this, savedInstanceState);
       // Set our view from the "main" layout resource
       SetContentView(Resource.Layout.activity_main);

       //界面中其他input元素
       name = FindViewById<EditText>(Resource.Id.editText1);
       inputtype = FindViewById<EditText>(Resource.Id.editText2);

       //界面中的按钮
       diaLogBtn = FindViewById<Button>(Resource.Id.button1); //使用系统自定义
  
       //按钮下的功能实现
       diaLogBtn.Click += DiaLogBtn_Click;
      
   }
 
  //使用系统默认的
   private void DiaLogBtn_Click(object sender, System.EventArgs e)
   {
       string select_string = "";
       builder = new Android.App.AlertDialog.Builder(this);
       string[] testData = new string[] {"选项1","选项2","选项3" }; //要在界面上展示的数据
       alertDialog = builder
           .SetTitle("提示")
           .SetSingleChoiceItems(testData,0, (s,e) => {   //表示设置的是单选框。这儿可以设置为单选、多选以及只是显示选项
               select_string = testData[e.Which];
           })
           .SetPositiveButton("确定", (s, e) => { //确定按钮及内部方法
               addData(name.Text, inputtype.Text, select_string);
           })
           .SetNegativeButton("关闭", (s, e) => { //界面上的关闭按钮及方法
               alertDialog.Dismiss();
           })
           .Create();

       alertDialog.Show();
   }

   //具体的业务方法(例如,调用API,存储到数据库中)
   private void addData(string name,string type,string selected)
   {
       Toast.MakeText(this, "所选择的内容分别为:"+name+";"+type+";"+selected, ToastLength.Long).Show();
       alertDialog.Dismiss();
   }
}

在对话框的实现中,还可以设置为选项、多选框,可通过设置SetItems()SetMultiChoiceItems等方法实现。
通过以上代码,就可以实现。效果如下:

1.2 效果

在界面上的text框内,录入相关内容,并在弹出的框中,选择选项后,点击保存(图2),界面会弹出text及所选文本框的内容(图3)。
输入内容及进行选择
图2 界面上录入的内容,并选择相应选项
选择内容的展示
图3 具体的展示效果

2、自定义样式的实现

2.1 预期效果

预期效果如下所示:
预期效果
因为需要自定义窗体,所以需要对窗体进行定义。

2.2 具体实现

窗体说明
窗体分为上中下三个部分。因此在Resources/layout文件夹中添加布局文件view_dialog_custom.xml.具体代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout_relative"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
		<!--头部-->
    <RelativeLayout
        android:id="@+id/layout_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:background="#53cc66"
        android:padding="5dp">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:text="提示文本"
            android:textSize="18sp"
            android:textStyle="bold"
           android:textColor="#ffffff"
        />
        <Button
            android:id="@+id/btn_cancel"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_alignParentRight="true"
            android:background="@drawable/btn_selector_exit" />
    </RelativeLayout>

    <!--中间内容-->
    <LinearLayout
        android:id="@+id/layout_detail"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:layout_below="@+id/layout_title"
        android:layout_centerInParent="true"
        android:orientation="vertical"
       android:background="#f1f1f1"
        android:padding="20dp"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="自定义对话框"
            android:textColor="#04AEDA"
            android:textSize="18sp" />

            <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="作者:郑林"
            android:textColor="#04AEDA"
            android:textSize="18sp" />
    </LinearLayout>
    
		<!--底部按钮-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/layout_detail"
        android:orientation="horizontal"
        android:background="#f1f1f1"
        android:padding="5dp"
      >
        <Button
            android:id="@+id/btn_blog"
            android:layout_width="match_parent"
            android:layout_height="45dp"
            android:layout_weight="1"
            android:background="@drawable/btn_selector_choose"
            android:text="访问博客"
            android:textColor="#ffffff"
            android:textSize="20sp"
            android:layout_marginRight="5dp"
      />
      
         <Button
            android:id="@+id/btn_close"
            android:layout_width="match_parent"
            android:layout_height="45dp"
            android:layout_weight="1"
            android:background="@drawable/btn_selector_choose"
            android:text="关闭对话框"
            android:textColor="#ffffff"
            android:textSize="20sp" />
    
    </LinearLayout>
</RelativeLayout>

在布局文件中,头部中按钮的样式,引用了Resources/drawablebtn_selector_exit.xml文件。具体代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_pressed="true" android:drawable="@drawable/exit_press"/>
  <item android:drawable="@drawable/exit"/>
</selector>

在底部的按钮,同样引用了Resources/drawablebtn_selector_choose.xml文件,具体代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_pressed="true"  android:drawable="@drawable/pressed_color"  />
  <item  android:drawable="@drawable/default_color"  />
</selector>

这两个样式,其最核心的功能就是,button的press_down后,颜色发生变化。

以上就定义了样式。

下面是核心的活动定义的实现部分。
在MainActivity中,具体定义如下:

protected override void OnCreate(Bundle savedInstanceState)
{
   base.OnCreate(savedInstanceState);
   Xamarin.Essentials.Platform.Init(this, savedInstanceState);
   // Set our view from the "main" layout resource
   SetContentView(Resource.Layout.activity_main);

   //界面中其他input
   name = FindViewById<EditText>(Resource.Id.editText1);
   inputtype = FindViewById<EditText>(Resource.Id.editText2);

   //界面中的按钮
   diaLogBtn = FindViewById<Button>(Resource.Id.button1); //使用系统自定义
   selfDefineBtn = FindViewById<Button>(Resource.Id.button2);//使用自定义的样式

   //按钮下的功能实现
   diaLogBtn.Click += DiaLogBtn_Click;
   selfDefineBtn.Click += SelefDefineBtn_Click;
}


//自定义样式的具体实现
private void SelefDefineBtn_Click(object sender, System.EventArgs e)
{
   //加载自定的样式,使样式成为View。再将View赋给dialog
   LayoutInflater layoutInflater = LayoutInflater.From(this);
   var view_customer = layoutInflater.Inflate(Resource.Layout.view_dialog_custom, null, false);

   builder = new Android.App.AlertDialog.Builder(this);
   builder.SetView(view_customer);
   builder.SetCancelable(false);
   alertDialog = builder.Create();

   view_customer.FindViewById(Resource.Id.btn_cancel).Click += (s, e) =>
   {
       Toast.MakeText(this, "对话框已关闭", ToastLength.Short).Show();
       alertDialog.Dismiss();
   };
   view_customer.FindViewById(Resource.Id.btn_blog).Click += delegate
   {
       Toast.MakeText(this, "正在访问博客", ToastLength.Short).Show();
       Uri uri = Uri.Parse("https://blog.csdn.net/zlbcdn");
       Intent intent = new Intent(Intent.ActionView, uri);
       StartActivity(intent);
       alertDialog.Dismiss();
   };
   view_customer.FindViewById(Resource.Id.btn_close).Click += delegate
   {
       Toast.MakeText(this, "对话框已关闭", ToastLength.Short).Show();
       alertDialog.Dismiss();
   };

   alertDialog.Show();
}

2.3 相关知识

在整个过程中就是使用了AlertDialog 。一般创建对话框的逻辑:
构造显示Dialog的一般流程,构造AlertDialog.Builder,然后设置各种属性,最后调用AlertDialog.Builder.create方法获取AlertDialog对象,并且create方法中会执行,构造AlertDialog,设置dialog各种属性的操作。最后我们调用Dialog.show方法展示窗口,初始化Dialog的布局文件,Window对象等,然后执行mWindowManager.addView方法,开始执行绘制View的操作,并最终将Dialog显示出来;

3 代码下载

代码下载地址:代码下载,提取码:ZLNH

4、参考

1、xamarin android alertdialog详解(几种弹出窗口)
2、【推荐***推荐】AlertDialog的六种创建方式
3、AlertDialog 详解

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

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

相关文章

miui刷机完整教程

风险提示&#xff1a;刷机有可能损害手机&#xff0c;本作者不承担因为使用本方法刷机引起的任何问题&#xff0c;请谨慎刷机。 1.选择[刷机包](https://web.vip.miui.com/page/info/mio/mio/detail?postId37093637&app_versiondev.20051) 2.解BL锁 浏览器打开http://www…

SSM整合(二)

SSM框架整合之mybatis查询的两个例子 1 准备工作 1.1 创建查询工作所需要的实体类Emp package com.entity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import tk.mybatis.mapper.annotation.KeySql; import javax.persisten…

代码随想录算法训练营第四天|24、19、面试题 02.07、142、92(寄了)

Leecode24. 两两交换链表中的节点 链接&#xff1a;https://leetcode.cn/problems/swap-nodes-in-pairs/ 其实这道题的思路和203比较相似&#xff0c;因为若是不设置虚拟头结点的话&#xff0c;处理头结点的方式和处理非头结点的方式会不一样&#xff0c;所以还是设置虚拟头结…

LeetCode力扣刷题——指针三剑客之三:图

图 一、数据结构介绍 作为指针三剑客之三&#xff0c;图是树的升级版。图通常分为有向&#xff08;directed&#xff09;或无向&#xff08;undirected&#xff09;&#xff0c;有 循环&#xff08;cyclic&#xff09;或无循环&#xff08;acyclic&#xff09;&#xff0c;所有…

Golang入门笔记(15)—— 数组和切片

编程的世界中&#xff0c;或许是因为一次一次的定义变量&#xff0c;维护管理起来都太费劲了&#xff0c;所以推出了数组&#xff0c;将数据用数组的形式管理起来。 Go的数组和Java的实现机制是不同的&#xff0c;Go语言的数组是作为基本数据类型存在的。所以数组是开辟在栈帧中…

Golang Web开发一键生成各层级模板代码

文章目录go_project_quickstart快速开始要求安装项目实现架构设计代码逻辑统一的调用逻辑代码复用每次写web项目&#xff0c;模板都是统一的&#xff0c;每次都要写大量冗余的代码会很烦&#xff0c;在Java中有很多逆向生成的工具&#xff0c;而Go语言我找了很久&#xff0c;也…

手把手搭建springboot项目,并测试springDataJPA

这篇文章记录了搭建springboot项目并测试springDataJPA的过程&#xff0c;接下来一起看看吧。 1.访问阿里云java脚手架网站 点击访问 2.按照下图勾选并获取代码 3.将获取到的代码解压到idea工作空间。 下图的JPAdemo就是我的项目 4.打开idea&#xff0c;导入项目 5.在pom…

【Redis】| 01 | Redis 可视化工具RedisInsight

目录1 RedisInsight 简介2 RedisInsight 安装2.1 安装2.1.1 软件安装2.1.1.1 下载 RedisInsight 软件包2.1.1.2 安装命令2.1.1.3 配置环境变量2.1.1.4 启动服务2.1.2 Kubernetes 安装2.1.2.1 创建 RedisInsight 的 yaml 文件2.1.2.2 启动3.RedisInsight 使用3.1 安装redis3.1.1…

Jacobi迭代的MPI进阶——计算通信重叠和虚拟进程的使用

1:条形分割的几种策略 这里先放Makefile和run.slurm Makefile CC = mpicc FLAGS = -O3 -Wall OBJ = *.o EXE = hang hangstartall Ihang xunihang qipan srqipan Isrqipan qipanendall: ${EXE}hang: hang.c $(CC) -o $@ $^ $(FLAGS)

信息安全结业复习题(选择 + 填空 + 简答 + 计算 + 设计 )含历年考题

这里写目录标题客观题知识点简答题计算题设计题客观题知识点 考过填空 密码学是保障信息安全的核心、信息安全是密码学研究和发展的目标 保证数字信息机密性的最有效方法是使用密码算法对其进行加密&#xff08;对称和非对称&#xff09; 保证信息完整性的有效方法是利用hash…

SQL Server全套教程(基于SQL语句----续更中)

SQL Server全套教程全程干货1. 数据库的基础操作1.1.0 创建数据库1.1.1 查看及修改数据库1.1.3 分离、附加和删除数据库2.数据库表的相关操作2.1.0 常用数据类型2.1.1 表结构的创建2.1.2 表结构的查看及修改1. 数据库的基础操作 1.1.0 创建数据库 数据库创建语法 -- 创建数据…

MicroPython-On-ESP8266——8x8LED点阵模块(2)使用74HC595驱动

MicroPython-On-ESP8266——8x8LED点阵模块&#xff08;2&#xff09;使用74HC595驱动 1. 使用74HC595驱动的原理 1.1. 基础回顾 上篇我们学习了8x8LED点阵屏的电路基础知识和驱动的原理&#xff0c;见 8x8LED点阵模块&#xff08;1&#xff09;驱动原理 里面也提到了&…

基于ssm+Javaweb的OA小型企业资源管理系统-计算机毕业设计

小型OA企业资源管理系统基于SSM(SpringSpringMVCMyBatis)框架,适用于毕业设计&#xff0c;采用javaweb,基于B/S模式,Myeclipse或者eclipse idea为开发工具,mysql数据库,主要包括登录模块、人事管理模块、公告管理模块、产品管理模块、和退出模块等多个模块。 本系统主要包含了…

MySQL高级篇知识点——主从复制

目录1.主从复制概述1.1.如何提升数据库并发能力1.2.主从复制的作用2.主从复制的原理2.1.原理剖析2.2.复制的基本原则3.一主一从架构搭建3.1.准备工作3.2.主机配置文件3.3.从机配置文件3.4.主机&#xff1a;建立账户并授权3.5.从机&#xff1a;配置需要复制的主机3.6.测试3.7.停…

tensorflow2.x --------------------DenseNet-----------------------------

用tensorflow2.4实现了DenseNet-121,训练基于ImageNet图像数据集&#xff0c;图片输入大小为 224x224 。网络结构采用包含4个DenseBlock的DenseNet-BC&#xff0c;每个DenseNet-BC由若干个 BNReLU1x1 ConvBNReLU3x3 Conv&#xff08;Dense_layer)且每个DenseBlock的特征图大小分…

听我劝,自学游戏建模真的很难

我的个人建议一直是偏向不要自学建模的&#xff08;特别是零基础&#x1f923;&#xff09;&#xff0c;学习3D游戏建模除了单纯需要为爱发电还需要能够自行✅掌握软件操作技巧和✅纠错改正&#xff0c;后者都是自学非常❌难做到的&#x1f62d; 除此之外&#xff0c;还有以下…

详解Unity中的Nav Mesh新特性|导航寻路系统 (二)

前言 第一篇我们简要概述了新版NavMesh的一些新增功能&#xff0c;以及旧版的对比。本篇我们来讲一讲NavMeshSurface、NavMeshLink这两个组件的参数以及如何应用&#xff0c;接下来就进入正题吧。 本系列提要 Unity新版NavMesh专题博客共分成三篇来讲解&#xff1a; 【本篇为…

Golang入门笔记(最后一章 17 封版)—— 映射map

映射 (map) 作为一个常用的类型&#xff0c;Go语言已为我们开发者内置了map类型。 基本语法&#xff1a; var 变量名 map [keyT类型] valueT类型 这里T就是一个类型代表&#xff08;我这么写&#xff0c;有点受到了Java的泛型影响&#xff09;&#xff0c;key的类型通常为str…

【20-业务开发-基础业务-商品模块-分类管理-前端展示后端具有层级关系的目录数据-商品系统三级分类的逻辑删除前后端代码实现】

一.知识回顾 【0.三高商城系统的专题专栏都帮你整理好了&#xff0c;请点击这里&#xff01;】 【1-系统架构演进过程】 【2-微服务系统架构需求】 【3-高性能、高并发、高可用的三高商城系统项目介绍】 【4-Linux云服务器上安装Docker】 【5-Docker安装部署MySQL和Redis服务】…

JUC线程池——newSingleThreadExecutor源码解析JDK提供线程池ThreadPoolExecutor执行任务流程解析

newSingleThreadExecutor源码解析&&JDK提供线程池ThreadPoolExecutor执行任务流程解析测试代码核心代码解析ThreadPoolExecutor内部类&#xff1a;Worker解析调试台线程切换到执行异步任务的线程ThreadPoolExecutor&#xff1a;getTask()LinkedBlockingQueue&#xff1…