這麼晚了,可能也由於一點事情,就說打開博客園看看,結果 http://www.cnblogs.com/mindwind/p/5125248.html 這篇文章瞬間吸引了我。暗暗的回想一下,十年以後,我是什麼樣子,仍是那樣嗎?爲了生計奔波,爲了那點渺茫的將來去爭取……html
在寫這個的時候,我忽然發現,我寫的上一篇 三,居然被轉載了,哈哈,歡迎技術交流。android
直接開始吧。面試
這篇文章就說了一些簡單的佈局控件、提示信息設置和對話框設置。瀏覽器
今天咱們主要說一下其餘的數據組件、廣播、服務。dom
1、數據組件ide
一、數據適配器工具
界面咱們直接在左側工具欄拖一個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>類型,這裏就是添加數據。post
在Android裏面,相似這樣的,都須要一個數據適配器,就是這裏的listview.Adapter,咱們經過FindViewById<ListView>,直接查找到給賦值就能夠,在這裏呢,用了一個相對複雜的 SimpleAdapter,其中第三個參數 Resource.Layout.layout_SimpleAdapter ,這個是本身定義的一個佈局文件,固然,能夠直接採起系統的佈局文件,看下面代碼。this
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,第二個參數就引用了系統的佈局。
二、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 文件中定義的一個常量。
三、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設置每行間距
2、通訊
通訊在這裏可能用的不太恰當,其實這個在前面已經提到了, Intent
一、基本跳轉
咱們首先來創建一個基本頁面,來實現接收。
在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獲取這個變量。
直接啓動就能夠在虛擬機裏面看到效果了。
二、實現隱式意圖
在跳轉的基礎上,咱們在 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(); };
}
}
經過這裏的註釋咱們就能夠看明白,這個是什麼意思了,這裏就是添加一個打開 網頁時的 隱式意圖,好比咱們的手機系統裏面安裝了好多個瀏覽器,個人手機裏面不是有 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,到這裏啓動,當咱們跳轉過來,而後點擊這個頁面的時候,咱們是否是能夠有一個選擇了。
3、廣播
廣播這個我不知道怎麼解釋了,簡單的說一下,就是說,好比咱們要打開軟件的時候,而後直接跳轉到開始界面的時候,某一些應用程序會告訴你,已經轉到後臺運行,這個廣播的意思就是說,咱們一樣有這麼一個惟一標示被監聽,廣播的目的就是監聽事件。
具體能夠參考: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 文件版本的問題,運行不了。
額,凌晨兩點了,有點餓了,但願你們夥看到 有點餓的面子上,歡迎指證錯誤、動起來您那可愛的小手,默默地給推薦一下,須要源碼的同窗能夠留言。