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

基础控件

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软件的部署。

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

相关文章:

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

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

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

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

注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!
若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!

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

  1. C#-Xamarin的Android项目开发(三)——发布、部署、打包

    前言 部署,通常的情况下,它其实也是项目开发的一个难点. 为什么这么说呢?因为,它不是代码开发,所以很多开发者本能的拒绝学习它. 并且一个项目配置好一次以后,部署的步骤和部署的人通常很固定,所以大部分 ...

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

    创建项目 使用Xamarin开发安卓项目,首先需要安装VS2017以上版本.因为VS2017以上的版本,可以直接创建Xamarin项目. 另外用Xamarin开发安卓项目,还需要使用Intel的CPU ...

  3. Android项目开发二

    微博客户端开发 本周学习计划 学习布局控件和UI设计相关知识. 微博验证,学习OAuth相关知识. 看懂微博客户端开发部分代码. 把借鉴代码导入到Android Studio中并运行成功. 实际完成情 ...

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

    本篇博文接上篇的<Android项目开发全程(一)--创建工程>,主要介绍一下在本项目中用到的一个很重要的框架-Afinal,由于本系列博文重点是项目开发全程,所以在这里就先介绍一下本项目 ...

  5. Android项目开发全程(四)-- 将网络返回的json字符串轻松转换成listview列表

    前面几篇博文介绍了从项目搭建到获取网络字符串,对一个项目的前期整体工作进行了详细的介绍,本篇接着上篇介绍一下怎么样优雅将网络返回的json字符串轻松转换成listview列表. 先上图,看一下效果. ...

  6. Android项目开发一

    Android项目开发一   进度计划 1.第一周 开源中国注册账号:http://my.oschina.net/u/2511208,并上传Android HelloWorld程序代码 搭建Andro ...

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

    转载一个很牛逼的控件收集帖... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.Gri ...

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

    第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.P ...

  9. Android项目开发全程(三)-- 项目的前期搭建、网络请求封装是怎样实现的

    在前两篇博文中已经做了铺垫,下面咱们就可以用前面介绍过的内容开始做一个小项目了(项目中会用到Afinal框架,不会用Afinal的童鞋可以先看一下上一篇博文),正所谓麻雀虽小,五脏俱全,这在里我会尽量 ...

随机推荐

  1. 实例解析Collections源码,Iterator和ListIterator

    比如一个视频或文章有多个页面标签设置,我们在看一篇文章或一个视频时,底部有为你推荐栏目. 如何根据这个文章或视频的标签,来实现这个推荐栏目呢. public List<VideoInfoVo&g ...

  2. Awesome Big Data List

    https://github.com/onurakpolat/awesome-bigdata A curated list of awesome big data frameworks, resour ...

  3. 选择Web框架的20条标准

    原文观点由Matt Raible提出,关于Matt Rabile的介绍:http://www.infoq.com/cn/author/Matt-Raible 内容摘自<Java程序员修炼之道&g ...

  4. Android字符串资源及其格式化

    http://blog.csdn.NET/wsywl/article/details/6555959 在Android项目布局中,资源以XML文件的形式存储在res/目录下.为了更好的实现国际化及本地 ...

  5. 浅谈Java多线程的同步问题 【转】

    多线程的同步依靠的是对象锁机制,synchronized关键字的背后就是利用了封锁来实现对共享资源的互斥访问. 下面以一个简单的实例来进行对比分析.实例要完成的工作非常简单,就是创建10个线程,每个线 ...

  6. Java高并发之无锁与Atomic源码分析

    目录 CAS原理 AtomicInteger Unsafe AtomicReference AtomicStampedReference AtomicIntegerArray AtomicIntege ...

  7. 怎么确定Oracle客户端安装成功

    可通过能否登录sqlplus来判断是否安装成功. 操作系统:windows10 oracle版本:oracle 11g 步骤: 1.电脑win键+R键,输入cmd,进入命令提示符. 2.命令行中输入: ...

  8. 唱吧DevOps的落地,微服务CI/CD的范本技术解读----最大的难点并不是实际业务代码的编写,而是服务的监控和调试以及容器的编排

    1.业务架构:从单体式到微服务 K歌亭是唱吧的一条新业务线,旨在提供线下便捷的快餐式K歌方式,用户可以在一个电话亭大小的空间里完成K歌体验.K歌亭在客户端有VOD.微信和Web共三个交互入口,业务复杂 ...

  9. 如何开始使用 Java 机器学习

    开始Java机器学习的最好工具是什么? 这个问题已经有一段时间了,但最近这些日子几乎每个人都在谈论人工智能和机器学习.这已经不再是一个保留给科学家和研究者的秘密,而是几乎实现于每一项新兴技术中. 在下 ...

  10. Javascript 进阶 继承

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/29194261 1.基于类的继承 下面看下面的代码: <script typ ...