MonoDroid学习笔记(九)—— 控件大串烧,在Android上做一个CSDN的注册页面。

搞过winform或webform的朋友肯定都对控件非常熟悉,开发过程中界面上都要用到很多的相关控件。今天我们就来学习一下Android里的几个常用控件。拿CSDN的注册页面来作为参考,我们也来布局一个类似的手机页面。

CSDN的注册页面如下:http://passport.csdn.net/account/register,查看这个页面的源代码我们就可以发现,它是由一个table来进行布局的。那我们很自然的就想到我们手机的页面就使用TableLayout来进行布局吧:

[xhtml]  view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"  
  3.             android:layout_width="fill_parent"  
  4.             android:layout_height="fill_parent">  
  5.   <TableLayout  
  6.       android:layout_width="fill_parent"  
  7.       android:layout_height="fill_parent"  
  8.       android:stretchColumns="1">  
  9.     <TextView android:text="帐户信息"  
  10.               android:background="#FFFFEFDB"  
  11.               android:layout_width="fill_parent"  
  12.               android:layout_height="30px"  
  13.               android:textColor="#FF000000"  
  14.               android:layout_centerVertical="true"/>  
  15.     <TableRow>  
  16.       <TextView android:text="用户名:"  
  17.                 android:layout_width="wrap_content"  
  18.                 android:layout_height="wrap_content"/>  
  19.       <EditText android:id="@+id/txtUserName"  
  20.                 android:layout_height="wrap_content"  
  21.                 android:layout_width="fill_parent"  
  22.                 android:layout_column="1"  
  23.                 android:layout_alignParentRight="true" />  
  24.     </TableRow>  
  25.     <TableRow>  
  26.       <TextView android:text="密码:"  
  27.                 android:layout_width="wrap_content"  
  28.                 android:layout_height="wrap_content"/>  
  29.       <EditText android:id="@+id/txtPassword"  
  30.                 android:layout_height="wrap_content"  
  31.                 android:layout_width="fill_parent"  
  32.                 android:layout_column="1"  
  33.                 android:password="true"/>  
  34.     </TableRow>  
  35.     <TableRow>  
  36.       <TextView android:text="密码确认:"  
  37.                 android:layout_width="wrap_content"  
  38.                 android:layout_height="wrap_content"  
  39.                 android:id="@+id/tvConfirm"/>  
  40.       <EditText android:id="@+id/txtConfirmPassword"  
  41.                 android:layout_height="wrap_content"  
  42.                 android:layout_width="fill_parent"  
  43.                 android:layout_column="1"  
  44.                 android:password="true"/>  
  45.     </TableRow>  
  46.     <TableRow>  
  47.       <TextView android:text="E-Mail:"  
  48.                 android:layout_width="wrap_content"  
  49.                 android:layout_height="wrap_content"/>  
  50.       <EditText android:id="@+id/txtEmail"  
  51.                 android:layout_height="wrap_content"  
  52.                 android:layout_width="fill_parent"  
  53.                 android:layout_column="1"/>  
  54.     </TableRow>  
  55.     <TextView android:text="用户信息"  
  56.               android:background="#FFFFEFDB"  
  57.               android:layout_width="fill_parent"  
  58.               android:layout_height="30px"  
  59.               android:textColor="#FF000000"  
  60.               android:layout_centerVertical="true"/>  
  61.     <TableRow>  
  62.       <TextView android:text="来自:"  
  63.                 android:layout_width="wrap_content"  
  64.                 android:layout_height="wrap_content"/>  
  65.       <Spinner android:id="@+id/spinFrom"  
  66.                android:layout_height="wrap_content"  
  67.                android:layout_width="fill_parent"></Spinner>  
  68.     </TableRow>  
  69.     <TableRow>  
  70.       <TextView android:text="性别:"  
  71.                 android:layout_width="wrap_content"  
  72.                 android:layout_height="wrap_content"/>  
  73.       <RadioGroup android:orientation="horizontal"  
  74.                   android:id="@+id/rgGender"  
  75.                   android:layout_height="wrap_content"  
  76.                android:layout_width="fill_parent">  
  77.         <RadioButton android:id="@+id/rbMale"  
  78.                      android:text="男"  
  79.                      android:layout_width="wrap_content"  
  80.                      android:layout_height="wrap_content"/>  
  81.         <RadioButton android:id="@+id/rbFemale"  
  82.                      android:text="女"  
  83.                      android:layout_width="wrap_content"  
  84.                      android:layout_height="wrap_content"/>  
  85.       </RadioGroup>  
  86.     </TableRow>  
  87.     <TableRow>  
  88.       <TextView android:text="职位:"  
  89.                 android:layout_width="wrap_content"  
  90.                 android:layout_height="wrap_content"/>  
  91.       <Spinner android:id="@+id/spinPosition"  
  92.                android:layout_height="wrap_content"  
  93.                android:layout_width="fill_parent"></Spinner>  
  94.     </TableRow>  
  95.     <TableRow>  
  96.       <TextView android:text="行业:"  
  97.                 android:layout_width="wrap_content"  
  98.                 android:layout_height="wrap_content"/>  
  99.       <Spinner android:id="@+id/spinIndustry"  
  100.                android:layout_height="wrap_content"  
  101.                android:layout_width="fill_parent"></Spinner>  
  102.     </TableRow>  
  103.     <TableRow>  
  104.       <TextView android:text="工作年限:"  
  105.                 android:layout_width="wrap_content"  
  106.                 android:layout_height="wrap_content"/>  
  107.       <Spinner android:id="@+id/spinWorkExp"  
  108.                android:layout_height="wrap_content"  
  109.                android:layout_width="fill_parent"  
  110.                android:entries="@+array/workExp">  
  111.       </Spinner>  
  112.     </TableRow>  
  113.     <TableRow>  
  114.       <TextView android:text="校验码:"  
  115.                 android:layout_width="wrap_content"  
  116.                 android:layout_height="wrap_content"/>  
  117.       <EditText android:id="@+id/txtValidate"  
  118.                 android:layout_height="wrap_content"  
  119.                android:layout_width="fill_parent"/>  
  120.     </TableRow>  
  121.     <TableRow android:visibility="gone" android:id="@+id/rowValidate">  
  122.       <TextView android:id="@+id/tvValidate"  
  123.                 android:layout_width="wrap_content"  
  124.                 android:layout_height="wrap_content"  
  125.                 android:layout_column="1"/>  
  126.     </TableRow>  
  127.     <TableRow>  
  128.       <TextView android:text="注册条款:"  
  129.                 android:layout_width="wrap_content"  
  130.                 android:layout_height="wrap_content"/>  
  131.       <CheckBox android:text="我已仔细阅读并接受CSDN注册条款"  
  132.                 android:layout_width="wrap_content"  
  133.                 android:layout_height="wrap_content"  
  134.                 android:id="@+id/cbAccept"/>  
  135.     </TableRow>  
  136.     <TableRow>  
  137.       <Button android:id="@+id/btnOK"  
  138.               android:layout_width="wrap_content"  
  139.                 android:layout_height="wrap_content"  
  140.               android:text="确定"/>  
  141.     </TableRow>  
  142.   </TableLayout>  
  143. </ScrollView>  
 

从上面的布局文件我们可以看到,由于我们的手机屏幕较小,不能在一屏显示所有的信息,所以在TableLayout外面还套了一层ScollView,当页面内容超出一屏时,会出现纵向滚动条。

如果页面某些字段没有填写,我们需要弹出提示。还记得我们之前已经封装过一个MessageBox类了吗?但里面的AlertDialog标题中只有文字而没有图标,我们再增加一个Alert方法,使其弹出的对话框的标题中显示一个叹号图片,这个图片是Android里自带的:

[c-sharp]  view plain copy print ?
  1. public static void Alert(Context ctx, string message)  
  2. {  
  3.     CreateDialog(ctx, "提示", message).SetIcon(Android.Resource.Drawable.IcDialogAlert).SetPositiveButton("确定"delegate { }).Show();  
  4. }  
 

Android中的下拉菜单是Spinner,相当于winform中的ComboBox,Html中的<select>,由于手机画面有限,在有限的范围选择项目,下拉菜单是唯一,也是较好的选择。为Spinner增加下拉项有很多种方法,在这里我使用了两种方法。一是直接在布局文件Main.axml中指定了Spinner的android:entries属性,见上面布局文件中的“工作年限”这一项,有这么个属性:android:entries="@+array/workExp"。这代表这个Spinner引用了一个叫做workExp的array。那么这个array是在哪里定义的呢?我们在Layout文件下新增一个叫做WorkExperience.xml的文件,内容如下:

[xhtml]  view plain copy print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.   <string-array name="workExp">  
  4.     <item>学生</item>  
  5.     <item>一年</item>  
  6.     <item>两年</item>  
  7.     <item>三年</item>  
  8.     <item>三年到五年</item>  
  9.     <item>五年以上</item>  
  10.   </string-array>  
  11. </resources>  
 

这里的workExp就是被Spinner引用的array了。

另一种方法是在OnCreate方法里增加:

[c-sharp]  view plain copy print ?
  1. Spinner spinFrom = FindViewById<Spinner>(Resource.Id.spinFrom);  
  2. spinFrom.Adapter = InitAdapter(new string[] { "北京""上海""广州""深圳""杭州""南京""成都""武汉" });  
  3. Spinner spinPosition = FindViewById<Spinner>(Resource.Id.spinPosition);  
  4. spinPosition.Adapter = InitAdapter(new string[] { "CTO""产品总监""项目总监""产品经理""技术经理""项目经理""系统架构师""需求分析师""软件工程师" });  
  5. Spinner spinIndustry = FindViewById<Spinner>(Resource.Id.spinIndustry);  
  6. spinIndustry.Adapter = InitAdapter(new string[] { "移动与手机应用""金融""电信""互联网""物流""电子政务" });  
 

 

在点击校验码的输入框时,我们会出现一组五位随机字符串的验证码,这个效果我是这样实现的。在布局文件中有一个TableRow放了一个TextView,用来生成校验码,TableRow一开始是隐藏的,在点击了输入验证码的输入框后才可见。所以我们要对txtValidate输入框的Touch事件绑定处理方法:

[c-sharp]  view plain copy print ?
  1. EditText txtValidate = FindViewById<EditText>(Resource.Id.txtValidate);  
  2. txtValidate.SetOnTouchListener(new MyTouchListener());  
 

MyTouchListener是一个实现了EditText.IOnTouchListener接口的类,用以实现点击输入框时的逻辑。记得实现Java的接口时,要继承Java.Lang.Object类:

[c-sharp]  view plain copy print ?
  1. class MyTouchListener : Java.Lang.Object, EditText.IOnTouchListener  
  2. {  
  3.     const string str = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";  
  4.     public bool OnTouch(View v, MotionEvent e)  
  5.     {  
  6.         TableRow row = ((Activity)v.Context).FindViewById<TableRow>(Resource.Id.rowValidate);  
  7.         row.Visibility = ViewStates.Visible;  
  8.         TextView tv = ((Activity)v.Context).FindViewById<TextView>(Resource.Id.tvValidate);  
  9.         tv.Visibility = ViewStates.Visible;  
  10.         Random r = new Random();  
  11.         char[] chars = new char[5];  
  12.         for (int i = 0; i < 5; i++)  
  13.         {  
  14.             chars[i] = str[r.Next(0, str.Length)];  
  15.         }  
  16.         tv.Text = new string(chars);  
  17.         return true;  
  18.     }  
  19. }  
 

 

在点击确定按钮时,我们要对页面的字段进行校验,有非空的校验,也有输入内容一致性的校验,这部分内容比较简单,我就不一一介绍了,先定义一个实现Button.IOnClickListener接口的类,实现按钮点击的逻辑,然后在按钮的SetOnClickListener中传入该类的实例化对象:

[c-sharp]  view plain copy print ?
  1. Button btnOK = FindViewById<Button>(Resource.Id.btnOK);  
  2. btnOK.SetOnClickListener(new MyClickListener(this));  
 

[c-sharp]  view plain copy print ?
  1. class MyClickListener : Java.Lang.Object, Button.IOnClickListener  
  2. {  
  3.     Activity act;  
  4.     public MyClickListener(Activity act)  
  5.     {  
  6.         this.act = act;  
  7.     }  
  8.     private bool ValidateEditText(int id, string name)  
  9.     {  
  10.          
  11.         if (string.IsNullOrEmpty(act.FindViewById<EditText>(id).Text))  
  12.         {  
  13.             MessageBox.Alert(act, name + "不能为空");  
  14.             return false;  
  15.         }  
  16.         return true;  
  17.     }  
  18.     public void OnClick(View v)  
  19.     {  
  20.         Activity act = v.Context as Activity;  
  21.         if (!ValidateEditText(Resource.Id.txtUserName, "用户名"))  
  22.             return;  
  23.         EditText txtPassword = act.FindViewById<EditText>(Resource.Id.txtPassword);  
  24.         if (!ValidateEditText(Resource.Id.txtPassword, "密码"))  
  25.             return;  
  26.         if (!ValidateEditText(Resource.Id.txtConfirmPassword, "密码确认"))  
  27.             return;  
  28.         if (act.FindViewById<EditText>(Resource.Id.txtPassword).Text != act.FindViewById<EditText>(Resource.Id.txtConfirmPassword).Text)  
  29.         {  
  30.             MessageBox.Alert(act, "两次输入密码不一致");  
  31.             return;  
  32.         }  
  33.         if (!ValidateEditText(Resource.Id.txtEmail, "邮箱"))  
  34.             return;  
  35.         if (!act.FindViewById<RadioButton>(Resource.Id.rbMale).Checked && !act.FindViewById<RadioButton>(Resource.Id.rbFemale).Checked)  
  36.         {  
  37.             MessageBox.Alert(act, "请选择性别");  
  38.             return;  
  39.         }  
  40.         if (!ValidateEditText(Resource.Id.txtValidate, "校验码"))  
  41.             return;  
  42.         if (act.FindViewById<EditText>(Resource.Id.txtValidate).Text != act.FindViewById<TextView>(Resource.Id.tvValidate).Text)  
  43.         {  
  44.             MessageBox.Alert(act, "校验码输入错误");  
  45.             return;  
  46.         }  
  47.         if (!act.FindViewById<CheckBox>(Resource.Id.cbAccept).Checked)  
  48.         {  
  49.             MessageBox.Alert(act, "你必须接受CSDN协议");  
  50.             return;  
  51.         }  
  52.         MessageBox.Alert(act, "注册成功");  
  53.     }  
  54. }  
 

 

运行效果:

MonoDroid学习笔记(九)—— 控件大串烧,在Android上做一个CSDN的注册页面。

 

这里介绍了控件的一些常用属性和操作,更深入的应用留给大家慢慢发掘了~~

转载http://blog.csdn.net/ojlovecd/article/details/6319186

你可能感兴趣的:(android)