Xamarin.Android实现界面自动添加控件

目录

  • 1、背景说明
  • 2、效果
  • 3、代码
    • 3.1、UI代码
    • 3.2、实现代码
  • 4、代码下载
  • 5、相关知识点
    • 5.1、原理说明
    • 5.2、其他说明
  • 6、参考资料

1、背景说明

有时需要在APP中动态的添加控件,因此记录下在Xamarin中的实现步骤。
VS2022社区版

2、效果

在这里插入图片描述

3、代码

3.1、UI代码

UI的代码如何

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"app:layout_behavior="@string/appbar_scrolling_view_behavior"tools:showIn="@layout/activity_main"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1">  <!--注意,这儿的权重是1--><ScrollViewandroid:id="@+id/scrollView"android:layout_width="match_parent"android:layout_height="match_parent"android:scrollbars="none"><LinearLayoutandroid:id="@+id/linearlayout"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:isScrollContainer="false"android:padding="10dp"><!--下面这个布局主要是方便计算的--><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:baselineAligned="true"android:orientation="horizontal"></LinearLayout></LinearLayout></ScrollView></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:id="@+id/btn_add"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:background="#34ab8b"android:layout_margin="10dip"android:text="添加"android:textSize="18dp"android:textColor="#fff"/><Buttonandroid:id="@+id/btn_edit"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:background="#34ab8b"android:layout_margin="10dip"android:text="编辑"android:textSize="18dp"android:textColor="#fff"/></LinearLayout></LinearLayout>

3.2、实现代码

活动中的代码如下:

using System;
using Android.App;
using Android.OS;
using Android.Runtime;
using Android.Views;
using AndroidX.AppCompat.Widget;
using AndroidX.AppCompat.App;
using Google.Android.Material.FloatingActionButton;
using Google.Android.Material.Snackbar;
using Android.Widget;
using Java.Lang;
using System.Collections.Generic;
using System.Drawing;namespace DynamicAddControls
{[Activity(Label = "@string/app_name", Theme = "@style/AppTheme.NoActionBar", MainLauncher = true)]public class MainActivity : AppCompatActivity{private LinearLayout linearLayout;//Button索引private List<Button> ListBtn_Show;//TextView索引private List<TextView> ListText_Def;private Button btn_add, btn_edit;//判断btn_edit的状态private int EDITSTATE = 0;protected override void OnCreate(Bundle savedInstanceState){base.OnCreate(savedInstanceState);Xamarin.Essentials.Platform.Init(this, savedInstanceState);SetContentView(Resource.Layout.activity_main);AndroidX.AppCompat.Widget.Toolbar toolbar = FindViewById<AndroidX.AppCompat.Widget.Toolbar>(Resource.Id.toolbar);SetSupportActionBar(toolbar);FloatingActionButton fab = FindViewById<FloatingActionButton>(Resource.Id.fab);fab.Click += FabOnClick;inited();}public override bool OnCreateOptionsMenu(IMenu menu){MenuInflater.Inflate(Resource.Menu.menu_main, menu);return true;}public override bool OnOptionsItemSelected(IMenuItem item){int id = item.ItemId;if (id == Resource.Id.action_settings){return true;}return base.OnOptionsItemSelected(item);}private void FabOnClick(object sender, EventArgs eventArgs){View view = (View) sender;Snackbar.Make(view, "Replace with your own action", Snackbar.LengthLong).SetAction("Action", (View.IOnClickListener)null).Show();}public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults){Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);base.OnRequestPermissionsResult(requestCode, permissions, grantResults);}private void inited(){linearLayout = (LinearLayout)FindViewById(Resource.Id.linearlayout);ListBtn_Show = new List<Button>();ListText_Def = new List<TextView>();btn_edit = (Button)FindViewById(Resource.Id.btn_edit);btn_add = (Button)FindViewById(Resource.Id.btn_add);btn_add.Click += Btn_add_Click;btn_edit.Click += Btn_edit_Click;}private void Btn_edit_Click(object sender, EventArgs e){if (EDITSTATE == 0){btn_edit.Text = "确定";EDITSTATE = 1;}else if (EDITSTATE == 1){btn_edit.Text = "编辑";EDITSTATE = 0;}}private void Btn_add_Click(object sender, EventArgs e){addBtn();//动态添加按钮}private void addBtn(){//动态添加按钮//添加承载两个按钮的LinearLayoutLinearLayout linear_layout = new LinearLayout(this);linear_layout.Orientation= Orientation.Horizontal;//在同一个linearLayout中水平放置两个控件LinearLayout.LayoutParams liParam = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent,ViewGroup.LayoutParams.WrapContent);linear_layout.LayoutParameters = liParam;//添加左侧的ButtonButton btnShow = new Button(this);LinearLayout.LayoutParams btnAddPar = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WrapContent, 108, 3);//设置宽高及占比btnAddPar.SetMargins(0, 10, 0, 10);btnShow.LayoutParameters=btnAddPar;//设置文本及颜色btnShow.Text=ListBtn_Show.Count + ""+ linear_layout.Id;btnShow.SetTextColor(Android.Graphics.Color.Argb(255, 255, 255, 255));btnShow.SetBackgroundColor(Android.Graphics.Color.Argb(255, 52, 171, 139));btnShow.Click += BtnShow_Click;//注册事件linear_layout.AddView(btnShow);//把btnShow添加到linear_btn中ListBtn_Show.Add(btnShow);//把btnShow添加到索引中//添加右侧的TextViewTextView textDef = new TextView(this);//设置文本的格式LinearLayout.LayoutParams btnDefPar = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WrapContent, 108, 1);//设置宽高及占比btnDefPar.SetMargins(0, 10, 0, 10);textDef.LayoutParameters=btnDefPar;textDef.Text="设为默认";textDef.Gravity=GravityFlags.Center;textDef.SetTextColor(Android.Graphics.Color.Argb(255, 255, 255, 255));textDef.SetBackgroundColor(Android.Graphics.Color.Argb(255, 52, 171, 139));textDef.Click += TextDef_Click;linear_layout.AddView(textDef);//把textDef添加到linear_btn中ListText_Def.Add(textDef);//把textDef添加到索引中linearLayout.AddView(linear_layout);//把linear_btn添加到外层linearLayout中}//设为默认的功能private void TextDef_Click(object sender, EventArgs e){View view = sender as View;setDef(view);//设置默认}private void BtnShow_Click(object sender, EventArgs e){View view = sender as View;if (EDITSTATE == 1) { }delBtn(view);//动态删除按钮}private void setDef(View view){//设置默认//遍历索引里的所有TextViewfor (int i = 0; i < ListText_Def.Count; i++){ListText_Def[i].SetBackgroundColor(Android.Graphics.Color.Argb(255, 52, 171, 139));ListText_Def[i].Text="设为默认";if (ListText_Def[i] == view){view.SetBackgroundColor(Android.Graphics.Color.Argb(255, 171, 52, 56));ListText_Def[i].Text="默认";}}}private void delBtn(View view){//动态删除按钮if (view == null){return;}int position = -1;for (int i = 0; i < ListBtn_Show.Count; i++){if (ListBtn_Show[i] == view){position = i;break;}}if (position >= 0){ListBtn_Show.RemoveAt(position);//从索引中移除被删除的ButtonListText_Def.RemoveAt(position);//从索引中移除被删除的TextViewlinearLayout.RemoveViewAt(position + 1);//在外出linearLayout删除内部指定位置所有控件}}}
}

4、代码下载

正在审核中,待审核通过后,补充链接

5、相关知识点

5.1、原理说明

界面中添加控件,就是通过AddView方法实现的,方法有如下的重载版本:

public unsafe virtual void AddView(View? child)
public unsafe virtual void AddView(View? child, LayoutParams? @params)
public unsafe virtual void AddView(View? child, int index)
public unsafe virtual void AddView(View? child, int index, LayoutParams? @params)
public unsafe virtual void AddView(View? child, int width, int height)

参数child就是要添加的控件元素;LayoutParams代表待添加元素的样式。但也不一定非得添加这个参数,因为可以在控件的LayoutParameters属性中设置样式。index是索引,从0开始;widthheight设置控件的大小。具体可以参考上面的代码。

5.2、其他说明

还有一个方法是直接将样式文件加载成View,然后再通过addView直接实现

//获取视图,其中R.layout.CodeView是xml布局
View v1 =LayoutInflater.from(context).inflate(R.layout.CodeView,null,false);//添加视图v1到容器v		
v.addView(v1);

6、参考资料

1、Android笔记——动态添加删除控件,及添加点击事件,本文主要参考这一篇,其介绍通过Android实现动态加载,本人主要是将其转为了C#版本
2、简析Android 动态添加控件的几种方式
3、关于 layout_weight,你到底知多少,这一篇主要讲述UI中布局的,讲得浅显易懂,推荐

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

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

相关文章

22 分页控件

文章目录 界面设置初始化主对话框子页面初始化 页面1枚举窗口页面2枚举进程全部代码 界面设置 ui 设置 >创建CTablCtrl > 创建页控件&#xff08;子窗口&#xff09;&#xff0c;style设置成为chlid 添加类 页面中加入listCtrl 控件 添加变量 分别添加初始化函数 初始化…

U启动盘(NETBASE第十二课)

1.域环境组策略的应用规则 1&#xff09;策略的继承 继承&#xff1a;默认下级容器继承上级容器的组策略配置Default Domain Policy禁止更改桌面背景运行-dsa.msc创建OU并命名为caiwu&#xff0c;在caiwu的OU中创建新用户xmxm用户在win10客户端主机登录&#xff0c;验证不能更…

RestClient操作索引库

一、初始化RestClient 分为三步&#xff1a; 1&#xff09;引入es的RestHighLevelClient依赖&#xff1a; <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dep…

xxl-job定时任务测试

配置执行器 启动相关xxl-job客户端服务后&#xff0c;会自动注册机器地址 简单任务 /*** 简单任务** param params* return*/XxlJob(value "demoJob")public ReturnT<String> demoJobHandler(String params) {log.info("我是 jeecg-system 服务里的定时任…

第一百零五天学习记录:数据结构与算法基础:顺序表(王卓教学视频)

注&#xff1a;笔记截图均来自王卓数据结构教学视频 线性表的定义和特点 线性表是具有相同特性的数据元素的一个有限序列 同一线性表中的元素必定具有相同特性&#xff0c;数据元素间的关系是线性关系。 线性表的逻辑特征 稀疏多项式的运算 顺序存储结构存在的问题 1、存…

k8s 中的卷

前面的文章我们分享了 pod &#xff0c;RC&#xff0c;RS&#xff0c;DaemonSet&#xff0c;CJ&#xff0c;Service 等各种资源 今天我们来分享一波如何将磁盘挂载到容器中&#xff0c;在 docker 里面这种技术叫做 数据卷&#xff0c;感兴趣的小伙伴可以查看一下文章&#xff…

TypeScript 学习笔记(二):接口与类型别名、字面量类型

一、接口的定义 在面向对象的编程中&#xff0c;接口是一种规范的定义&#xff0c;它定义了行为和动作的规范&#xff0c;在程序设计里面&#xff0c;接口起到一种限制和规范的作用。接口定义了某一批类所需要遵守的规范&#xff0c;接口不关心这些类的内部状态数据&#xff0…

MySQL内外连接

目录 内连接 外连接 左外连接 右外连接 内连接 内连接实际上就是利用 where 子句对两种表形成的笛卡儿积进行筛选 select 字段 from 表 1 inner join 表 2 on 连接条件 and 其他条件 显示SMITH的名字和部门名称 使用inner join 写法上是基本类似的。 外连接 左外…

如何使用ChatGPT制作免费的数字人

传统的数字人制作过程 制作属于自己的免费的数字人是一个复杂的过程&#xff0c;需要涉及多个方面的知识和技术。以下是一个大致的步骤指南&#xff0c;以帮助你开始这个过程&#xff1a; 1. 确定数字人的目标和设计&#xff1a;首先&#xff0c;你需要确定数字人的用途和目标…

校园跑腿小程序都包括哪些业务呢?

校园创业&#xff0c;大家都知道&#xff0c;一直以来是个非常火热的话题&#xff0c;每位步入大学校园的学子们都有过在校创业的想法&#xff0c;包括我们一些有着学校资源的社会创业者们&#xff0c;早已经看好了中国高校这块巨大的市场。 在这里&#xff0c;我要跟大家分享…

kubernetes 1.27.3 集群部署方案

一、准备环境 1.1 Kubernetes 1.27.3 版本集群部署环境准备 1.1.1 主机硬件配置说明 cpu内存硬盘角色主机名系统版本 8C 8G 1024GB master master01 centos 7.9 8C 16G 1024GB worker(node) worker01 centos 7.9 8C 16G 1024GB worker(node) worker…

3. MySQL - 数据类型 选项约束

目录 回顾 1. 命令行下的 MySql 客户端 2. 图形化界面的 MySQL-Client 3. 数据库概述 3.1 数据库管理系统是什么 3.2 工作模式 3.3 RDBMS 管理数据的结构 3.4 客户端连接服务器的信息 4. MySQL 中的数据类型 4.1 整型类型 4.2 字符串 4.3 日期/时间 5. MySQL 每个字…