Xamarin.Android再體驗之簡單的登陸Demo

1、前言

在空閒之餘,學學新東西android

2、服務端的代碼編寫與部署

這裏採起的方式是MVC+EF返回Json數據,(原本是想用Nancy來實現的,想一想電腦太卡就不開多個虛擬機了,用用IIS部署也好)git

主要是接受客戶端的登錄請求,服務器端返回請求的結果github

這裏的內容比較簡單不在囉嗦,直接上代碼了:json

 1 using System.Linq;
 2 using System.Web.Mvc;
 3 namespace Catcher.AndroidDemo.EasyLogOn.Service.Controllers
 4 {
 5     public class UserController : Controller
 6     {        
 7         public ActionResult LogOn(string userName, string userPwd)
 8         {
 9             bool result = IsAuth(userName,userPwd);
10             ReturnModel m = new ReturnModel();
11             if (result)
12             {
13                 m.Code = "00000";
14                 m.Msg = "Success";
15             }
16             else
17             {
18                 m.Code = "00001";
19                 m.Msg = "Failure";
20             }
21             return Json(m, JsonRequestBehavior.AllowGet);          
22         }
23         public bool IsAuth(string name, string pwd)
24         {
25             using (Models.DBDemo db = new Models.DBDemo())
26             {
27                 int count = db.UserInfo.Count(u=>u.UserName==name&&u.UPassword==pwd);
28                 return count == 1 ? true : false;
29             }            
30         }
31     }
32     public class ReturnModel
33     {
34         public string Code { get; set; }
35         public string Msg { get; set; }
36     }
37 }  

 

發佈,測試一下是否可行服務器

OK網絡

3、客戶端(Android)的編碼實現

既然是登陸,確定有兩個文本框和一個登錄按鈕啦~app

登陸以後又要有什麼呢,顯示一下歡迎就夠了,放一個TextViewide

下面就來佈局一下(左邊是Main.axml,右邊是User.axml)佈局

      

具體的佈局代碼以下:測試

Main.axml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical"
 4     android:layout_width="fill_parent"
 5     android:layout_height="fill_parent">
 6     <LinearLayout
 7         android:orientation="horizontal"
 8         android:minWidth="25px"
 9         android:minHeight="80px"
10         android:layout_marginTop="20dp"
11         android:layout_width="match_parent"
12         android:layout_height="wrap_content"
13         android:id="@+id/linearLayoutForName">
14         <TextView
15             android:text="姓名:"
16             android:layout_width="81.5dp"
17             android:layout_height="match_parent"
18             android:id="@+id/textViewName"
19             android:textAllCaps="true"
20             android:textSize="25dp"
21             android:textStyle="bold"
22             android:gravity="center" />
23         <EditText
24             android:layout_width="291.0dp"
25             android:layout_height="match_parent"
26             android:id="@+id/txtName" />
27     </LinearLayout>
28     <LinearLayout
29         android:orientation="horizontal"
30         android:minWidth="25px"
31         android:minHeight="80px"
32         android:layout_width="match_parent"
33         android:layout_height="wrap_content"
34         android:layout_below="@id/linearLayoutForName"
35         android:layout_marginTop="20dp"
36         android:id="@+id/linearLayoutForPwd">
37         <TextView
38             android:text="密碼:"
39             android:layout_width="81.5dp"
40             android:layout_height="match_parent"
41             android:id="@+id/textViewPwd"
42             android:textAllCaps="true"
43             android:textSize="25dp"
44             android:textStyle="bold"
45             android:gravity="center" />
46         <EditText
47             android:layout_width="291.0dp"
48             android:layout_height="match_parent"
49             android:id="@+id/txtPwd"
50             android:inputType="textPassword" />
51     </LinearLayout>
52     <Button
53         android:text="登陸"
54         android:layout_width="match_parent"
55         android:layout_height="wrap_content"
56         android:layout_marginTop="20dp"
57         android:layout_below="@id/linearLayoutForPwd"
58         android:id="@+id/btnLogin"
59         android:textAllCaps="true"
60         android:textSize="25dp"
61         android:textStyle="bold"
62         android:gravity="center" />
63 </RelativeLayout>  

 

User.axml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="vertical"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     android:minWidth="25px"
 7     android:minHeight="25px">
 8     <TextView
 9         android:text="Text"
10         android:layout_width="match_parent"
11         android:layout_height="wrap_content"
12         android:id="@+id/tvInfo"
13         android:minHeight="60dp"
14         android:gravity="center"
15         android:textSize="20dp" />
16 </LinearLayout>  

 

主要是是相對佈局與線性佈局的結合

佈局好了,就該編寫實現代碼了!!

MainActivity.cs 

主要就是接收用戶的輸入,進行判斷和校驗,經過的就跳轉到下一頁面。這裏面還用到了一點網絡請求。

由於是演示,因此是一大堆代碼。。。

裏面有用到json的解析,用的是Newtonsoft.Joson,固然,寫法不規範,不要吐槽。

 1 using Android.App;
 2 using Android.Content;
 3 using Android.OS;
 4 using Android.Widget;
 5 using Newtonsoft.Json;
 6 using System;
 7 using System.IO;
 8 using System.Net;
 9 namespace Catcher.AndroidDemo.EasyLogOn
10 {
11     [Activity(Label = "簡單的登陸Demo", MainLauncher = true, Icon = "@drawable/icon")]
12     public class MainActivity : Activity
13     {
14         protected override void OnCreate(Bundle bundle)
15         {
16             base.OnCreate(bundle);
17             // Set our view from the "main" layout resource
18             SetContentView(Resource.Layout.Main);
19             EditText myName = FindViewById<EditText>(Resource.Id.txtName);
20             EditText myPwd = FindViewById<EditText>(Resource.Id.txtPwd);
21             Button login = FindViewById<Button>(Resource.Id.btnLogin);
22             login.Click += delegate
23            {
24                string name = myName.Text;
25                string pwd = myPwd.Text;
26                if (string.IsNullOrEmpty(name) || string.IsNullOrEmpty(pwd))
27                {
28                    Toast.MakeText(this, "請輸入用戶名和密碼!!", ToastLength.Long).Show();
29                    return;
30                }
31                else
32                {
33                    string loginUrl = string.Format("http://192.168.1.102:8077/User/LogOn?userName={0}&userPwd={1}", name, pwd);
34                    var httpReq = (HttpWebRequest)HttpWebRequest.Create(new Uri(loginUrl));
35                    var httpRes = (HttpWebResponse)httpReq.GetResponse();
36                    if (httpRes.StatusCode == HttpStatusCode.OK)
37                    {
38                        string result = new StreamReader(httpRes.GetResponseStream()).ReadToEnd();
39                        result = result.Replace("\"", "'");
40                        ReturnModel s = JsonConvert.DeserializeObject<ReturnModel>(result);
41                        if (s.Code == "00000")
42                        {
43                            var intent = new Intent(this, typeof(UserActivity));
44                            intent.PutExtra("name", name);
45                            StartActivity(intent);
46                        }
47                        else
48                        {
49                            Toast.MakeText(this, "用戶名或密碼不正確!!", ToastLength.Long).Show();
50                            return;
51                        }
52                    }
53                }
54            };
55         }
56     }
57     public class ReturnModel
58     {
59         public string Code { get; set; }
60         public string Msg { get; set; }
61     }
62 }

 

下面就是跳轉以後的頁面了,就是從MainActivity傳過來的用戶名顯示在TextView那裏。

 1 using Android.App;
 2 using Android.Content;
 3 using Android.OS;
 4 using Android.Widget;
 5 namespace Catcher.AndroidDemo.EasyLogOn
 6 {
 7     [Activity(Label = "用戶首頁")]
 8     public class UserActivity : Activity
 9     {
10         protected override void OnCreate(Bundle savedInstanceState)
11         {
12             base.OnCreate(savedInstanceState);
13             // Create your application here
14             SetContentView(Resource.Layout.User);
15             TextView info = FindViewById<TextView>(Resource.Id.tvInfo);
16             string name = Intent.GetStringExtra("name");
17             info.Text = name + "歡迎您的到來!" ;
18         }
19     }
20 }  

 

而後就OK了,是否是也很Easy呢。

下面來看看效果

什麼都不輸入的時候,輸入錯誤的時候,輸入正確的時候

         

若是想生成apk文件的話,須要將模式調整爲Release模式!!!

 

4、總結對比

跟原生的Android開發(Java)相比,有不少類似的地方也有不少細節區別,適應就好。

作這個Demo的時候,編寫界面的時候貌似沒發現有智能提示,不知道有沒有處理的好辦法!

須要注意的是,這個Demo在數據的傳輸過程當中並無進行加解密的處理,這是不可取的!

其餘的話,就兩個字的感受,方便。

 

最後附上這個Demo的代碼:

https://github.com/hwqdt/Demos/tree/master/src/Catcher.AndroidDemo

相關文章
相關標籤/搜索