欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2022-08-31 16:25:10
相信我,这不是一篇吐槽文章。。。。 基础控件 Android的控件和控件样式非常特别,它是一种内联特别高的设计模式,换句话说,它是非常烂的设计。。。。 但在这种特别的关系里还是有一定的规律的,下面我们一起来看看控件的使用方式。 首先我们定义一个ImageButton,如下: 如上代码所示,我们定义了 ......

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

基础控件

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文件。。。。如下图:

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

那么我们看看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里我们做了一下特殊处理,我们为行视图添加了图片。

运行结果如下图:

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

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

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

my_grid.itemclick += (s, e) =>
{
    this.showtoast("click me" + e.id);
};

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

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

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

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

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

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

github地址:https://github.com/kiba518/kibaxamarin_android

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

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