標籤:
這麼晚了,可能也因為一點事情,就說開啟部落格園看看,結果 http://www.cnblogs.com/mindwind/p/5125248.html 這篇文章瞬間吸引了我。暗暗的回想一下,十年之後,我是什麼樣子,還是那樣嗎?為了生計奔波,為了那點渺茫的未來去爭取……
在寫這個的時候,我突然發現,我寫的上一篇 三,竟然被轉載了,哈哈,歡迎技術交流。
直接開始吧。
Android(Xamarin)之旅(一) 這片文章說到了Xamain的簡單配置,Android檔案的目錄資訊清單檔,還有一些簡單的控制項。Android(Xamarin)之旅(二)
這篇文章對一些簡單的控制項做了介紹。還有介面的一部分清單。Android(Xamarin)之旅(三)
這篇文章就說了一些簡單的布局控制項、提示資訊設定和對話方塊設定。
今天我們主要說一下其他的資料群組件、廣播、服務。
一、資料群組件
1、資料配接器
介面我們直接在左側工具列拖一個ListView過來,然後通過後台綁定資料。
var list = new List<IDictionary<string, object>>(); Random rand = new Random(); for (int i = 0; i < 8; i++) { var dic = new JavaDictionary<string, object>(); dic.Add("name", "Tel:" + i); dic.Add("time", " Re"+rand.Next(100,999)); list.Add(dic); } SimpleAdapter sam_adapter = new SimpleAdapter(this, list, Resource.Layout.layout_SimpleAdapter, new string[] { "name", "time" }, new int[] { Resource.Id.tv_name, Resource.Id.tv_time }); var listview = FindViewById<ListView>(Resource.Id.listView1); listview.Adapter = sam_adapter;
解釋一下這裡的List<IDictionary<string, object>>(),這就是為了建立一個資料對象,這裡的JavaDictionary<string, object>()其實就是C#中的Dictionary<T,T>類型,這裡就是添加資料。
在Android裡面,類似這樣的,都需要一個資料配接器,就是這裡的listview.Adapter,我們通過FindViewById<ListView>,直接尋找到給賦值就可以,在這裡呢,用了一個相對複雜的 SimpleAdapter,其中第三個參數 Resource.Layout.layout_SimpleAdapter ,這個是自己定義的一個布局檔案,當然,可以直接採取系統的布局檔案,看下面代碼。
var list = new List<string>() { "a.mp3", "b.mp3", "c.mp3" }; ArrayAdapter<string> a_adaper = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleSpinnerItem, list);
如此,就可以看明白了吧,第一個參數this,意思就是當前活動的 Activity,第二個參數就引用了系統的布局。
2、Spinner
該控制項提供了從一個資料集合中快速選擇一項值的辦法。預設情況下Spinner顯示的是當前選擇的值,點擊Spinner會彈出一個包含所有可選值的dropdown菜單,從該菜單中可以為Spinner選擇一個新值。同樣,前面說到直接採用Adapter給賦值。如下。
var list = new List<string>() { "a.mp3", "b.mp3", "c.mp3" }; ArrayAdapter<string> a_adaper = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleSpinnerItem, list); Spinner sp = FindViewById<Spinner>(Resource.Id.spinner1); sp.Adapter = a_adaper; sp.SetPromptId(Resource.String.Title);
這裡的 SetPromptId 就是通過這個設定一個標題,這裡呢,我是自己的 strings.xml 檔案中定義的一個常量。
3、GridView
直接利用前面說到的資料控制項 SimpleAdapter ,直接在介面上拖拽一個 GridView過來即可。
var list_dic = new List<IDictionary<string, object>>(); for (int i = 0; i < 8; i++) { var dic = new JavaDictionary<string, object>(); dic.Add("name", "Tel:" + i); dic.Add("icon", Resource.Drawable.Icon); dic.Add("time", DateTime.Now.Second + ":" + DateTime.Now.Millisecond); list_dic.Add(dic); } SimpleAdapter sam_adapter = new SimpleAdapter(this, list_dic, Resource.Layout.layout_SimpleAdapter, new string[] { "name", "icon", "time" }, new int[] { Resource.Id.tv_name, Resource.Id.tv_time }); var gv1 = FindViewById<GridView>(Resource.Id.gridView1); gv1.Adapter = sam_adapter;
還是同時通過適配器 Adapter 來綁定資料。
附:GridView的一些屬性(其實百度隨便就能找到)
使用android:numColumns設定列數
使用android:columnWidth設定每列寬度
如果把android:numColumns的值改成”auto_fit”,配合android: columnWidth能自適應。
使用android:horizontalSpacing設定沒列間距
使用android:verticalSpacing設定每行間距
二、通訊
通訊在這裡可能用的不太恰當,其實這個在前面已經提到了, Intent
1、基本跳轉
我們首先來建立一個基本頁面,來實現接收。
在layout檔案夾上面選擇添加建立項直接建立一個 Android Layout的頁面。
這個頁面的目的是為了當跳轉過去之後確認成功。
接下來,我們添加一個新的 Activity。
為了介面的整齊,我們直接在項目上添加一個建立項。
目的是為和 MainActivity 處於目錄下面,然後加入代碼 SetContentView。
using System;using System.Collections.Generic;using System.Linq;using System.Text;using Android.App;using Android.Content;using Android.OS;using Android.Runtime;using Android.Views;using Android.Widget;namespace Test015{ [Activity(Label = "Activity2")] public class Activity1 : Activity { protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); //綁定視圖 SetContentView(Resource.Layout.layout1); } }}
加上這個的介面的目的就是為了讓有介面去接收。
在 MainActivity 的介面添加如下代碼。
Intent it = new Intent(this, typeof(Activity1)); StartActivity(it); it.PutExtra("test", "Mono for Android"); StartActivity(it); Finish();
這裡的 StartActivity 就是啟動這個意圖, 後面的 PutExtra 的目的就是傳遞一個 唯一標示為 name 的定量。然後,我們繼續在 Activity1 這個頁面添加代碼,把傳遞過來的資料接收一下,列印出來。當然,要實現這個,我們還是要實現 IDialogInterfaceOnClickListener 的介面
Toast.MakeText(this, Intent.GetStringExtra("test"), ToastLength.Long).Show();
public void OnClick(IDialogInterface dialog, int which) { Toast.MakeText(this, which + "", ToastLength.Short).Show(); }
在跳轉的 Activity 裡面直接去接收就可以, 採用 Intent.GetStringExtra("test") ,通過這個唯一標示name擷取這個變數。
直接啟動就可以在虛擬機器裡面看到效果了。
2、實現隱式意圖
在跳轉的基礎上,我們在 Activity1 的這個活動頁面上,添加過濾器,這個過濾器的位置,要添加在 public class Activity1 : Activity ,IDialogInterfaceOnClickListener 這句代碼的前面。
//建立隱式視圖 //只處理和http有關係的 [IntentFilter(new string[] { Intent.ActionView }, Categories = new string[] { Intent.CategoryDefault }, DataScheme = "http")]
public class Activity2 : Activity,IDialogInterfaceOnClickListener
{
public void OnClick(IDialogInterface dialog, int which)
{
Toast.MakeText(this, which + "", ToastLength.Short).Show();
}
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.layout1);
ImageButton ibtn = FindViewById<ImageButton>(Resource.Id.imageButton1);
ibtn.Click += delegate { url(); };
}
}
通過這裡的注釋我們就可以看明白,這個是什麼意思了,這裡就是添加一個開啟 網頁時的 隱式意圖,比如我們的手機系統裡面安裝了好多個瀏覽器,My Phone裡面不是有 UC瀏覽器,每次啟動的時候,有一個檢測,是不是預設瀏覽器,我們這個就是那個意思。下面的那個就是前面說到的實現的介面,和設定的綁定頁面。
要實現這個,我們首先要有一個開啟 url 的方法。 在我們前面添加的 layout1.axml 介面上添加一個按鈕,這個按鈕的目的就是實現一個 跳轉的 意圖,也就是顯示我們這裡的隱式意圖的作用。在代碼中添加單擊事件(在這裡不在贅述),和跳轉代碼。
private void url() { Intent it = new Intent(); it.SetAction(Intent.ActionView); it.SetData(Android.Net.Uri.Parse("http://www.baidu.com")); StartActivity(it); }
OK,到這裡啟動,當我們跳轉過來,然後點擊這個頁面的時候,我們是不是可以有一個選擇了。
三、廣播
廣播這個我不知道怎麼解釋了,簡單的說一下,就是說,比如我們要開啟軟體的時候,然後直接跳轉到開始介面的時候,某一些應用程式會告訴你,已經轉到後台運行,這個廣播的意思就是說,我們同樣有這麼一個唯一標示被監聽,廣播的目的就是監聽事件。
具體可以參考:http://www.cnblogs.com/qianlifeng/archive/2011/03/06/1972305.html
我們直接添加一個項目。介面代碼如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/MyButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/Hello" /> <Button android:id="@+id/Register" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="註冊廣播" /> <Button android:id="@+id/Cancel" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="取消註冊" /> <Button android:id="@+id/Send" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="發送廣播" /> <TextView android:text="Text" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="24sp" android:id="@+id/textView1" /></LinearLayout>
背景 MainActivity 代碼如下:
using System;using Android.App;using Android.Content;using Android.Runtime;using Android.Views;using Android.Widget;using Android.OS;using Java.Util;namespace Test017{ [Activity(Label = "MyAPK", MainLauncher = true, Icon = "@drawable/icon")] public class MainActivity : Activity { int count = 1; private ReceiveBroadCast receiveBroadCast; //廣播執行個體 /// <summary> /// 撥號介面 /// </summary> private string flag = "android.intent.action.CALL_BUTTON"; protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); // Set our view from the "main" layout resource SetContentView(Resource.Layout.Main); Button button = FindViewById<Button>(Resource.Id.MyButton); button.Click += delegate { button.Text = string.Format("{0} clicks!", count++); }; //註冊 Button btn_register = FindViewById<Button>(Resource.Id.Register); btn_register.Click += Btn_register_Click; //取消 Button btn_cancel = FindViewById<Button>(Resource.Id.Cancel); btn_cancel.Click += delegate { UnregisteLinster(); }; //發送廣播 Button btn_send = FindViewById<Button>(Resource.Id.Send); btn_send.Click += Btn_send_Click; } private void Btn_send_Click(object sender, EventArgs e) { Intent intent = new Intent(); //Itent就是我們要發送的內容 intent.PutExtra("data", "this is data from broadcast " + DateTime.Now.ToString("yyyy-MM-dd HH:ss:mm")); intent.SetAction(flag); //設定你這個廣播的action,只有和這個action一樣的接受者才能接受者才能接收廣播 SendBroadcast(intent); //發送廣播 } private void UnregisteLinster() { UnregisterReceiver(receiveBroadCast); } /// <summary> /// 繼承 /// </summary> public class ReceiveBroadCast : BroadcastReceiver { public override void OnReceive(Context context, Intent intent) { // //這裡的目的是為了監聽你的廣播是否起作用了 // ProgressDialog p_dialog = new ProgressDialog(context); p_dialog.SetMessage("正在載入……"); p_dialog.Show(); } } private void Btn_register_Click(object sender, EventArgs e) { receiveBroadCast = new ReceiveBroadCast(); IntentFilter filter = new IntentFilter(); filter.AddAction(flag); //只有持有相同的action的接受者才能接收此廣播 RegisterReceiver(receiveBroadCast, filter); } }}
我們直接運行,首先註冊這個廣播。然後點擊發送廣播,我們是不是就可以看到那個正在載入的提示資訊了。
關於Android的四大組件 Activity,Service服務,Content Provider內容提供者,BroadcastReceiver廣播接收器。目前為止,我們已經說到了 Activity 和 BroadcastReceiver廣播接收器。請待後續更新,因為我也是新手呀。
說點關於安裝的這個東西,不知道 win 8是怎麼了。我安裝的 Android Studio, SDK Manager 和 AVD Manager是沒有任何問題的,但是 Android Studio這個主介面啟動不了,最後在win7的虛擬機器上搗鼓了半天,可以了,在win xp上面試了一下,可能因為 jdk 檔案版本的問題,運行不了。
額,淩晨兩點了,有點餓了,希望大傢伙看到 有點餓的面子上,歡迎指證錯誤、動起來您那可愛的小手,默默地給推薦一下,需要源碼的同學可以留言。
Android(Xamarin)之旅(四)