Android(Xamarin)之旅(四)

來源:互聯網
上載者:User

標籤:

原文:Android(Xamarin)之旅(四)

這麼晚了,可能也因為一點事情,就說開啟部落格園看看,結果 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)之旅(四)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.