C#-Xamarin的Android项目开发(二)——控件应用

相信我,这不是一篇吐槽文章。。。。

基础控件

Android的控件和控件样式非常特别,它是一种内联特别高的设计模式,换句话说,它是非常烂的设计。。。。

但在这种特别的关系里还是有一定的规律的,下面我们一起来看看控件的使用方式。

首先我们定义一个ImageButton,如下:

<ImageButton
    android:src="@drawable/toolbar_upload_photo_normal"
    android:layout_gravity="right|center_vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/btn_weight" />

如上代码所示,我们定义了ImageButton,并且设置了他的Src地址,该地址指向了一个图片。

重点,我们来看这句,background="@drawable/btn_weight;背景色指向了一个资源,为什么用说指向的是个资源呢?因为btn_weight并不是个图片,而是个XML文件。。。。如下图:

那么我们看看btn_weight到底是什么把。

<?xml version="1.0" encoding="UTF-8"?>
<selector
  xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_window_focused="false" android:state_enabled="true" android:drawable="@drawable/btn_weight_normal" />
    <item android:state_enabled="false" android:drawable="@drawable/btn_weight_disable" />
    <item android:state_pressed="true" android:drawable="@drawable/btn_weight_press" />
    <item android:state_focused="true" android:drawable="@drawable/btn_weight_press" />
    <item android:drawable="@drawable/btn_weight_normal" />
</selector>

如上述代码所示,btn_weight里设置了按钮按下时和常规时的背景色。

没错,这种设置方法,确实很绕,按钮按下的事件和背景样式混在了一起设置,但在Android里,我们只能去适应它。

----------------------------------------------------------------------------------------------------

好了,现在基础控件写完了,有没有感觉自己从现代化城市回到了农耕社会。。。。

相信我,用Xamarin开发,你在农耕社会还有个犁耙,用AS开发,你会发现你只能用手挖。。。。

GridView

首先,Android的GridView是我见过最奇葩的列表使用方式。。。

然后,我们开始学习使用它把。

先找到GridView控件,代码如下:

GridView my_grid = this.FindControl<GridView>("my_grid");

接着,我们定义一个适配器,并把他赋值给GridView的的Adapter属性,代码如下:

IListAdapter adapter = new GridAdapter(this, this.Resources);
my_grid.Adapter = adapter;//配置适配器

嗯,这里看上去代码还算简洁,但接下来就不一样了,让我们来看看这个奇葩的适配器吧。

首先,我们看下适配器代码:

public class GridAdapter : BaseAdapter
    {
        private DisplayMetrics localDisplayMetrics;
        private LayoutInflater inflater;
        private Resources resources;
        public GridAdapter(Context context)
        {
            resources = context.Resources;
            localDisplayMetrics = resources.DisplayMetrics;
            inflater = LayoutInflater.From(context);
        }
        public override int Count => 9;
        public override Object GetItem(int position)
        {
            return null;
        }
        public override long GetItemId(int position)
        {
            return position;
        }
        public override View GetView(int paramInt, View paramView, ViewGroup paramViewGroup)
        {
            paramView = inflater.Inflate(Resource.Layout.activity_label_item, null);
            TextView text = (TextView)paramView.FindViewById(Resource.Id.activity_name);
            switch (paramInt)
            {
                case 0:
                    {
                        text.Text = "local";
                        Drawable draw = this.resources.GetDrawable(Resource.Drawable.home_button_local);
                        draw.SetBounds(0, 0, draw.IntrinsicWidth, draw.IntrinsicHeight);
                        text.SetCompoundDrawables(null, draw, null, null);
                        break;
                    }
                case 1:
                    {
                        text.Text = "search";
                        Drawable draw = this.resources.GetDrawable(Resource.Drawable.home_button_search);
                        draw.SetBounds(0, 0, draw.IntrinsicWidth, draw.IntrinsicHeight);
                        text.SetCompoundDrawables(null, draw, null, null);
                        break;
                    }
                case 2:
                    {
                        text.Text = "checkin";
                        Drawable draw = this.resources.GetDrawable(Resource.Drawable.home_button_checkin);
                        draw.SetBounds(0, 0, draw.IntrinsicWidth, draw.IntrinsicHeight);
                        text.SetCompoundDrawables(null, draw, null, null);
                        break;
                    }
                case 3:
                    {
                        text.Text = "promo";
                        Drawable draw = this.resources.GetDrawable(Resource.Drawable.home_button_promo);
                        draw.SetBounds(0, 0, draw.IntrinsicWidth, draw.IntrinsicHeight);
                        text.SetCompoundDrawables(null, draw, null, null);
                        break;
                    }
                case 4:
                    {
                        text.Text = "tuan";
                        Drawable draw = this.resources.GetDrawable(Resource.Drawable.home_button_tuan);
                        draw.SetBounds(0, 0, draw.IntrinsicWidth, draw.IntrinsicHeight);
                        text.SetCompoundDrawables(null, draw, null, null);
                        break;
                    }

                case 5:
                    {
                        text.Text = "rank";
                        Drawable draw = this.resources.GetDrawable(Resource.Drawable.home_button_rank);
                        draw.SetBounds(0, 0, draw.IntrinsicWidth, draw.IntrinsicHeight);
                        text.SetCompoundDrawables(null, draw, null, null);
                        break;
                    }
                case 6:
                    {
                        text.Text = "history";
                        Drawable draw = this.resources.GetDrawable(Resource.Drawable.home_button_history);
                        draw.SetBounds(0, 0, draw.IntrinsicWidth, draw.IntrinsicHeight);
                        text.SetCompoundDrawables(null, draw, null, null);
                        break;
                    }
                case 7:
                    {
                        text.Text = "myzone";
                        Drawable draw = this.resources.GetDrawable(Resource.Drawable.home_button_myzone);
                        draw.SetBounds(0, 0, draw.IntrinsicWidth, draw.IntrinsicHeight);
                        text.SetCompoundDrawables(null, draw, null, null);
                        break;
                    }
                case 8:
                    {
                        text.Text = "more";
                        Drawable draw = this.resources.GetDrawable(Resource.Drawable.home_button_more);
                        draw.SetBounds(0, 0, draw.IntrinsicWidth, draw.IntrinsicHeight);
                        text.SetCompoundDrawables(null, draw, null, null);
                        break;
                    }
            }
            paramView.SetMinimumHeight((int)(96.0F * localDisplayMetrics.Density));
            paramView.SetMinimumWidth(((-12 + localDisplayMetrics.WidthPixels) / 3));
            return paramView;
        }
    }

代码如上所示,适配器的构造函数接受了一个参数,是适配器所属Activity,主要用于在适配器里调用Activy的信息。

然后我们通过LayoutInflater(布局填充类),将xml布局文件实例化为它对应的View对象,以供后续使用。

然后我们重写BaseAdapter类的一些属性和方法。

其中重写的Count属性需要特别注意,他代表我们列表的显示数,他是需要赋值的。这里的事例为其定义了一个常数9。

接下来我们重点看下GetView方法。

GetView这个方法干了很多事,作为C#开发者,从字面上是很难理解它是干什么的;不过我们可以联想思考,我们暂时把他理解为行的导入事件,这样就很形象了吧。

因为,至于为什么会叫GetView,我想,大概是因为他即干了行绑定数据的事,又干了行视图布局的事,所以没有更合适的命名,才这么叫的吧。

这也是为什么我感觉他奇葩的原因,因为在之前的Activity和布局中已经混淆了视图和数据,然后,在控件里,我们又一次把数据和布局搅和在了一起。。。。

下面我们看看它是如何混淆,不,他是如何工作的吧。

首先,在行导入的GetView中,我们找到要填充的布局XML——activity_label_item.xml。

paramView = inflater.Inflate(Resource.Layout.activity_label_item, null);

接着,我们找这个行布局内的控件,然后为他赋值,这里activity_label_item.xml很简单,只有一个Textview,也就是说,这里我们需要做的就是给他赋值。

然后,我们通过paramInt来判断当前行,正常情况,在这里找到Activity的数据集合,找到集合的对应行赋值即可了。

Demo里我们做了一下特殊处理,我们为行视图添加了图片。

运行结果如下图:

如图所示,列表已经创建完成了。

下面我们为列表添加点击事件;代码如下:

my_grid.ItemClick += (s, e) =>
{
    this.ShowToast("Click Me" + e.Id);
};

代码很简单,也很简洁,实现效果如下:

如上图所示,我们成功的实现了点击事件。

到此,控件的基础应用就讲完了,下一篇继续讲解Android软件的部署。

----------------------------------------------------------------------------------------------------

代码已经传到Github上了,欢迎大家下载。

Github地址:https://github.com/kiba518/KibaXamarin_Android

----------------------------------------------------------------------------------------------------

注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文链接!
若您觉得这篇文章还不错,请点击下右下角的【推荐】,非常感谢!

原文地址:https://www.cnblogs.com/kiba/p/10395681.html

时间: 2024-10-10 13:09:20

C#-Xamarin的Android项目开发(二)——控件应用的相关文章

C#-Xamarin的Android项目开发(一)——创建项目

创建项目 使用Xamarin开发安卓项目,首先需要安装VS2017以上版本.因为VS2017以上的版本,可以直接创建Xamarin项目. 另外用Xamarin开发安卓项目,还需要使用Intel的CPU,并且得是双核以上的CPU,因为调试时,需要使用电脑的虚拟化,奔腾4之类的CPU是不支持虚拟化的. 下面我们创建KibaXamarin_Android项目,如下图: 点击确定后,会弹出一个选择模板的窗体,这里我们选择一个空白应用,并且选择最小安卓版本号为4.4,如下图: 点击OK后,项目创建完成,解

Android项目开发二

新浪微博客户端开发 本周学习计划 学习布局控件和UI设计相关知识. 微博验证,学习OAuth相关知识. 看懂微博客户端开发部分代码. 把借鉴代码导入到Android Studio中并运行成功. 实际完成情况 我学习到布局控件XML在res/layout中,是以.xml的形式保存.下图是登录界面,这个layout采用LinearLayout控件作为顶层控件,然后用ImageView控件分别实现版本号图片顶部靠左对齐显示.软件名称和图标图片居中对齐.作者名称和blog图片底部靠右对齐. 2.微博验证

android项目自定义组合控件添加属性

首先要在values文件下新建立一个文件arrts.xml,这个文件就是用来说明键名称是做什么的,和值的类型 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="SeetingView"> <attr name="up" format="string" /> &

android项目自定义组合控件

自定义控件首先要有一个布局文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="60dp" a

Android项目开发全程(二)--Afinal用法简单介绍

本篇博文接上篇的<Android项目开发全程(一)--创建工程>,主要介绍一下在本项目中用到的一个很重要的框架-Afinal,由于本系列博文重点是项目开发全程,所以在这里就先介绍一下本项目中用到的几个功能: Afinal简介 Afinal 是一个android的sqlite orm 和 ioc 框架.同时封装了android中的http框架,使其更加简单易用: 使用finalBitmap,无需考虑bitmap在android中加载的时候oom的问题和快速滑动的时候图片加载位置错位等问题. Af

Android常用酷炫控件(开源项目)github地址汇总

转载一个很牛逼的控件收集贴... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar.TextView.ScrollView.TimeView.TipView.FlipView.ColorPickView.GraphView.UI Style 等等. 一.ListView android-pulltorefresh一个强大的拉动

CSDN Android客户端开发(二):详解如何基于Java用Jsoup爬虫HTML数据

本文参考链接详细介绍如何使用Jsoup包抓取HTML数据,是一个纯java工程,并将其打包成jar包.希望了解如何用java语言爬虫网页的可以看下. 杂家前文就又介绍用HTTP访问百度主页得到html的string字符串,但html的文本数据如果不经过处理就是个文本字符串没有任何效果的.所谓的浏览器就是负责将文本的html"翻译"成看到的界面.在前文有介绍,这个csdn的客户端app分首页.业界.移动.研发.程序员.云计算五大类.以业界为例,http://news.csdn.net/ 

Android UI布局与控件(二)

一.View类的常用xml属性:[了解] ①.Android中所有的UI(用户界面)元素都是使用View和ViewGroup对象建立的 ②.View是一个可以将一些信息绘制在屏幕上并与用户产生交互的对象 ③.ViewGroup是一个包含多个的View和ViewGroup的容器,用来定义UI布局. ④.Android提供了一系列的View和ViewGroup的子类,开发者可以灵活地组合使用它们来完成界面布 局.界 面元素绘制和用户交互等工作 ⑤.开发者还可以选择性地继承一些系统提供的View,来自

Xamarin.Forms Android PopupMenu问题二

Xamarin.Forms Android PopupMenu问题二 在上一篇文章Xamarin.Android 使用PopupMenu遇到的问题文章中讲到了兼容Android 5.0及以下版本,但又带了一个新的问题.这个问题在所有Android版本App都会遇到,此时会抛出一个异常: Java.Lang.RuntimeException: Failed to resolve attribute at index 6 经过多番尝试(在Xamarin.Android中调试,原生Android中调试