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

这篇具有很好参考价值的文章主要介绍了Xamarin.Android实现界面自动添加控件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、背景说明

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

2、效果

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

3、代码

3.1、UI代码

UI的代码如何

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns: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">

  <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1">  <!--注意,这儿的权重是1-->

        <ScrollView
            android:id="@+id/scrollView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="none">

            <LinearLayout
                android:id="@+id/linearlayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:isScrollContainer="false"
                android:padding="10dp">

                <!--下面这个布局主要是方便计算的-->
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:baselineAligned="true"
                    android:orientation="horizontal">

                </LinearLayout>

            </LinearLayout>
        </ScrollView>
    </LinearLayout>

  <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android: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"/>
        <Button
            android: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()
        {//动态添加按钮
         //添加承载两个按钮的LinearLayout
            LinearLayout 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;

            //添加左侧的Button
            Button 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添加到索引中
            

            //添加右侧的TextView
            TextView 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)
        {//设置默认
         //遍历索引里的所有TextView
            for (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);//从索引中移除被删除的Button
                ListText_Def.RemoveAt(position);//从索引中移除被删除的TextView
                linearLayout.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中布局的,讲得浅显易懂,推荐文章来源地址https://www.toymoban.com/news/detail-617810.html

到了这里,关于Xamarin.Android实现界面自动添加控件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#使用xamarin进行跨平台开发

    使用 Xamarin 进行跨平台开发可以使用 C# 和 .NET 平台来开发移动应用程序,同时将代码在多个主要移动操作系统上运行,包括 Android 和 iOS。以下是在 C# 中使用 Xamarin 进行跨平台开发的一般步骤: 安装 Xamarin : 在开始之前,你需要安装 Xamarin 开发环境。你可以选择安装 Visual

    2024年02月11日
    浏览(65)
  • PLC-IoT 网关开发札记(6): Xamarin.Forms 的 CollectionView 绑定了什么?

    项目开发中不可避免地会遇到在一个页面中呈现列表的情况,使用 CollectionView 作为容器是很方便的。CollectionView 中显示的数据对应于后台的一个 IEnumerable 派生的列表,常用的是 ListT 和 VectorT,我习惯于使用 ListT 作为后台的数据表。 CollectionView 的每一项对应后台的 ListT 的一

    2024年01月23日
    浏览(55)
  • 第二章 Android控件与界面交互

    Android界面布局就是定义应用中的界面结构(例如Activity的界面结构)。界面布局中的所有元素均使用View和ViewGroup对象的层次结构进行构建。View通常用于绘制用户可查看并进行交互的内容。然而,ViewGroup是不可见容器,用于定义View和其他ViewGroup对象的布局结构,如图2.1所示

    2024年02月03日
    浏览(41)
  • Android布局和控件:创建用户界面的XML布局文件和常用UI控件详解

    在Android应用开发中,创建用户界面是一个重要的任务。通过使用XML布局文件和常用的UI控件,开发人员可以设计和构建出吸引人且功能丰富的应用界面。本文将详细介绍如何使用XML布局文件来创建Android应用的用户界面,并深入探讨一些常用UI控件的属性和用法。 XML布局文件是

    2024年02月17日
    浏览(43)
  • Android在系统界面上添加窗口

    WindowManager.addView()是Android中的一个方法,用于在屏幕上添加一个窗口。它允许你在应用程序的上下文之外创建一个窗口,并将其显示在其他应用程序或系统界面上。 新建一个自定义View用于显示 使用windowManager.addView()显示 首先创建了一个WindowManager对象,在这个对象上进行操作

    2024年01月18日
    浏览(35)
  • Flutter中为控件添加交互,带你一起探究Android事件分发机制

    ), ); } } 代码运行效果如图: 2.父widget管理widget的状态 对于父widget来说,管理状态并告诉其子widget何时更新通常是最有意义的。 例如,IconButton允许您将图标视为可点按的按钮。 IconButton是一个无状态的小部件,因为我们认为父widget需要知道该按钮是否被点击来采取相应的处理

    2024年04月11日
    浏览(44)
  • android:登录界面,输入框输入数量达到了之后自动隐藏键盘。

    一、前言: 这篇文章是关于当我们输入账号密码时,达到11位(自定义)时,自动隐藏键盘。 二、上代码: 界面布局: 对应的Activity:LoginMainActivity 新建一个工具类:ViewUtil

    2024年02月12日
    浏览(42)
  • RK android 9.0 添加sh脚本开机自动运行

    diff --git a/device.mk b/device.mk old mode 100644 new mode 100755 index 4c698b7..c635798 --- a/device.mk +++ b/device.mk @@ -126,6 +126,8 @@ PRODUCT_COPY_FILES +=      $(call add-to-product-copy-files-if-exists,device/rockchip/common/init.$(TARGET_BOARD_HARDWARE).bootmode.nvme.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.$(TARGET_BOARD_HARDWARE).bootm

    2024年02月08日
    浏览(84)
  • Android开发之自定义控件-组合控件的开发与实现

    最终实现的效果展示图:   类似支付宝微信,底部分隔线对齐标题效果:       完整渲染显示效果(包含三个条目右边不同颜色的文字): 立体效果:  隐藏资产总额条目右边更多箭头  隐藏中国历史条目右边的文字: 隐藏中国历史条目下边的分隔线: 隐藏条目2中国历史左

    2024年02月10日
    浏览(42)
  • Android 实现阅读用户协议的文字控件效果

    开发中,经常要用到一些阅读隐私协议的场景,原生的textview控件很难做到在一个控件里有两个点击事件,那现在就来安利一个强大的组件——SpannableStringBuilder。 先看看效果:  直接上代码,布局文件: 布局文件很容易理解,一个checkbox实现选中效果,旁边加一个textview。

    2024年02月15日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包