Android(Xamarin)之旅(四)

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

這麼晚了,可能也由於一點事情,就說打開博客園看看,結果 http://www.cnblogs.com/mindwind/p/5125248.html 這篇文章瞬間吸引了我。暗暗的回想一下,十年以後,我是什麼樣子,仍是那樣嗎?爲了生計奔波,爲了那點渺茫的將來去爭取……html

在寫這個的時候,我忽然發現,我寫的上一篇 三,居然被轉載了,哈哈,歡迎技術交流。android

直接開始吧。面試

Android(Xamarin)之旅(一)

  這片文章說到了Xamain的簡單配置,Android文件的目錄清單文件,還有一些簡單的控件。

Android(Xamarin)之旅(二)

  這篇文章對一些簡單的控件作了介紹。還有界面的一部分清單。

Android(Xamarin)之旅(三)

  這篇文章就說了一些簡單的佈局控件、提示信息設置和對話框設置。瀏覽器

  今天咱們主要說一下其餘的數據組件、廣播、服務。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 文件版本的問題,運行不了。

 

    額,凌晨兩點了,有點餓了,但願你們夥看到 有點餓的面子上,歡迎指證錯誤、動起來您那可愛的小手,默默地給推薦一下,須要源碼的同窗能夠留言。

相關文章
相關標籤/搜索