Android(Xamarin)之旅(二)

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

新的一年,新的開始,2016,我要作什麼,你們要作什麼,啦啦啦。php

  OK,上篇已經介紹了幾個簡單的控件,此次,咱們繼續說說控件。可是可能有人認爲這有什麼難的,問題不在這裏,而在於,若是你注意了每個空間,或者你就會發現,在不少的應用裏面,不少的玩意都是直接用的控件。html

1、Visual Studio 工具箱佈局android

  一、Other Widgets 這裏就一個Switch,其實也就是一個開關佈局git

  二、Images & Media 這裏面的有ImageButton、ImageView、MediaController、VideoView等等。這裏的這些就是引用的一些基本的播放器,能夠直接從字面意思領略。ide

  三、Layouts 佈局我就不說了工具

  四、Composite 通俗的說,這裏面的基本上都是相似列表的的那種控件,好比,ExpandableListView能夠作一個手風琴那樣的樣式(http://blog.csdn.net/gyflyx/article/details/6461242)再如ListView,也就是一個簡單的風格(http://www.cnblogs.com/allin/archive/2010/05/11/1732200.html)GridView(http://www.cnblogs.com/tinyphp/p/3855224.html)。。等等。佈局

  五、Advanced 裏面的這些我尚未看,不過感受仍是和佈局有關的。post

  六、Form Widgets 這裏面就是一些經常使用的,好比button、text、checkbox等等。測試

  七、Text Fields 如E-mail(http://www.2cto.com/kf/201209/153859.html),Password這類的,怎麼說,感受這個就屬於和系統交互數據的那部分組件。this

  八、Time & Date 這裏的包含了日期控件和時間控件等等。

  九、Other Layouts 從字面意思就能理解這是其餘的佈局了

  感受寫了這些沒什麼做用,仍是直接說怎麼用吧。百度網盤API下載:http://pan.baidu.com/s/1hqUeF6O

  這些個API能夠直接查詢,好比,我要查詢前面說到的ImageButton

  咱們能夠直接經過API來查詢,來找一些屬性,寫代碼應該都是這個道理了,寫的多了,理解了,也就記住了。

 

2、控件

  1、ImageView

  <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/imageView1" />

  這裏這麼寫的目的是爲了介紹幾個方法:

    ①、SetImageDrawable

  private void Set_iv_url() { ImageView iv1 = FindViewById<ImageView>(Resource.Id.imageView1); iv1.SetImageDrawable(Resources.GetDrawable(Resource.Drawable.myapk)); }

    這裏的SetImageDrawable這裏訪問的Resorce,也就是說訪問的是

    

    如圖,也就是說我這裏的寫法是直接經過在Resources的文件夾下面的drawable來訪問的,由於只要是資源文件,都有一個ID,也就是這裏的resID,可是確定會發現上面還有一個level.

    ②、SetImageLevel

    道理也是同樣,可是這裏傳遞的就是

    iv1.SetImageLevel(Android.Resource.Drawable.AlertDarkFrame);

     也就是說這裏的這個引用的是系統的資源,而不是上面的那個咱們拷貝進去的資源,固然,還有一些,好比SetImageBitmap,直接按照正常的寫法寫就能夠了。

  2、CheckBox

    <CheckBox
        android:text="是否顯示"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:checked="true"
        android:id="@+id/cb_test" />

     這個咱們就看一下CheckBox選中就能夠,可是怎麼在界面上獲得這個值呢。

      CheckBox cb = FindViewById<CheckBox>(Resource.Id.cb_test);
            cb.CheckedChange += Cb_CheckedChange;

     由於在Android全部的界面元素都要去尋找,因此強轉是每一步必需要寫的。

      /// <summary>
        /// 是否選擇,選擇提示框
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Cb_CheckedChange(object sender, CompoundButton.CheckedChangeEventArgs e)
        {
            //e.CheckedId
            //是否選中
            Toast.MakeText(this, e.IsChecked.ToString(), ToastLength.Long).Show();
        }

     這裏能夠看到Toast.MakeText這個方法,是須要添加命名空間 Android.Widget 的,固然引用都同樣,直接 using就能夠了,至於裏面的ToastLength是一個內置的枚舉值,後面的Show()方法,纔是重點,就是這個,才能打印到界面上,能夠嘗試一下。

  3、RadioGroup

  關於這個控件,你們應該能猜想是什麼了,直接拖到界面上,你就曉得了,而後把裏面的RadioButton的值變一變什麼的,你懂的

        private void Rb_RatingBarChange(object sender, RatingBar.RatingBarChangeEventArgs e)
        {
            Toast.MakeText(this, e.CheckedId.ToString(), ToastLength.Long).Show();
        }

   固然了,這個組件也是CheckedChange這個方法,直接調用這個方法,而後寫一個方法,委託給它就好。其中,由於這個是一組RadioButton,咱們經過如今的CheckedId能夠獲取到的就是以下這個ID,有了這個ID,咱們又能夠作不少事情了,啦啦啦。

  4、日期和時間控件

  爲何要直接這麼說呢,你們直接在工具欄就能夠看到 Time & Date,就在那裏面你一個個的去脫,就知道了。

    一、AnalogClock 就是一個石英錶的錶盤,直接拖過來就能看到效果的。

    二、DigitalClock 這個呢,是一個數字時鐘,能夠調解爲24小時制的,也能夠是上午下午的那種。

    三、TimePicker 這就是一個時間控件。做爲時間控件,那麼咱們首先確定要獲取到值。

            TimePicker tp = FindViewById<TimePicker>(Resource.Id.timePicker1);
            tp.SetIs24HourView(Java.Lang.Boolean.True);
            tp.TimeChanged += Tp_TimeChanged;

     在這裏,必定要注意SetIs24HourView()這個方法,尼瑪,各類坑爹,也就是說這個方法原本的值其實也就是true或者false,可是在這裏傳遞的時候,必須是Java.Lang.Boolean.True,Ok,說到這裏,請你們必定要注意,這就是個坑,

    在Vs2015裏面,只要是加了Java,好麼,你就照着寫就行,別想那麼多,雖然咱們都明白Boolean和Bool一個德行,可是呢,你懂的。

  private void Tp_TimeChanged(object sender, TimePicker.TimeChangedEventArgs e)
        {
            int hour = e.HourOfDay;
            int min = e.Minute;
            Toast.MakeText(this, hour.ToString() + ":" + min.ToString(), ToastLength.Short).Show();
        }

     如上,直接經過代碼獲取值就能夠了。不過可能由於虛擬機的關係,個人反應仍是至關慢的,可是放到實體機器上面,效率仍是不錯的。

    如圖,在紅色框裏面的信息就是咱們的Toast.MakeText方法,Show()以後獲得的效果,仍是不錯的麼,哈哈。

  5、RatingBar

  相信我,當我把這個控件拖到頁面上的時候,我瞬間驚呆了,尼瑪,這不就是訂餐軟件的打分、諸如天貓、京東此類的打分麼,個人個神呀。

  OK,咱們說說,怎麼獲取吧,看代碼

            RatingBar rb = FindViewById<RatingBar>(Resource.Id.ratingBar1);
            rb.Rating = 13f;//分數
            rb.RatingBarChange += Rb_RatingBarChange;
        private void Rb_RatingBarChange(object sender, RatingBar.RatingBarChangeEventArgs e)
        {
            if (e.FromUser)
            {
                Toast.MakeText(this, e.FromUser + "--" + e.Rating, ToastLength.Short).Show();
            }
        }

   其餘的我就不說了,就說一下這裏的FormUser的意思就是是否人爲改變,意思就是究竟是不是有效操做了,Rating,註釋也加了,分數,相信本身運行一下,大家有沒有感受其實咱們也是很叼的樣子。

  6、開關

  ToggleButton和Switch都有點開關的樣子,我也沒有具體看,直接就跳過了,看下效果圖。

  

 

3、發短信和打電話

  一、發短信 

  直接來界面代碼

  

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/et_sms_per"
        android:inputType="phone"
        android:textSize="48px"
        android:hint="聯繫人" />
    <EditText
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/et_sms_content"
        android:inputType="phone"
        android:textSize="48px"
        android:hint="請輸入內容" />
<!--wrap_content:包裹內容-->
    <ImageButton
        android:src="@drawable/resizeApi"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/img_btn_sms" />
</LinearLayout>

 

   順便說下這裏面能夠的 xmlns:android="http://schemas.android.com/apk/res/android" 這一段申明絕對不能漏掉,看效果圖。

  順便說下,這個按鈕圖片是網上找的,隨便找了一個,可能至關難看,不要問我爲何,額,就這樣。

  後臺代碼:

     protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            //獲取button
            ImageButton img_btn_sms = FindViewById<ImageButton>(Resource.Id.img_btn_sms);
            img_btn_sms.Click += delegate { btn_Send(); };
        }

        private void btn_Send()
        {
            //要發送的對象
            EditText et_per = FindViewById<EditText>(Resource.Id.et_sms_per);
            //要發送的內容
            EditText et_content = FindViewById<EditText>(Resource.Id.et_sms_content);
            //執行發送
            //得到默認的消息管理器
            SmsManager smsManager = SmsManager.Default;
            if (!string.IsNullOrEmpty(et_per.Text))
            {
                if (!string.IsNullOrEmpty(et_content.Text))
                {
                    //拆分信息
                    IList<string> list = smsManager.DivideMessage(et_content.Text);
                    //循環發送
                    foreach (string str in list)
                    {
                        //發送短信
                        smsManager.SendTextMessage(et_per.Text, null, str, null, null);
                        //顯示發送成功
                        Toast.MakeText(this, "發送成功!!", ToastLength.Long).Show();
                    }
                }
                else
                {
                    //沒有短信內容
                    Toast.MakeText(this, "沒有短信內容!", ToastLength.Long).Show();
                }
            }
            else
            {
                //顯示發送成功
                Toast.MakeText(this, "沒有填寫聯繫人!", ToastLength.Long).Show();
            }
        }

   簡單的解釋一下,首先,咱們要用到Android.Telephony,這個就是發短信的管理器,必需要用到這個系統運用。也就是SmsManager。

  短信有一個弊端,也就是說不能大於70字,理論值是這樣,那麼咱們在這裏採用DivideMessage() 這個就是用來拆分消息,拆分紅多條,可是,問題就來了,用戶接受到的確定是多條短信,因而呢,就有了 sendMultipartTextMessage() 這個方法,這個的目的就是說短信發送的時候其實仍是70個字這樣的截取的,收費仍是這麼收費的,可是,在接收的時候,咱們看到的是一條短信,至於到底爲何這樣,額,這個問題,對於我來講,有點高深,我也是百度的。。雖然我已經親自測試這個方法可用。

  接下來就說說我發短信遇到的問題吧,剛有代碼是不夠的,首先,由於我本地下載的是 API23 和API 15,大爺的,每次默認的都是創建的API23的程序,可是我只有一個API15的虛擬機,因此說,第一次啓動都失敗了。

  

  打開AVD Manage能夠看到咱們如今創建的虛擬機究竟是那個版本,而後程序→右鍵→屬性

  

  先看下是否是匹配,而後再繼續,問題又來了,就像咱們操做Android手機同樣,不是有一個root麼,也就是說要有權限,坑爹呀,一樣,右鍵屬性

  

  對,就是這裏,權限勾選上,OK,終於成了。

  2、打電話

  打電話相對而言就簡單了。一樣的,寫一個EditText,獲取要撥打的電話號碼,而後寫一個Button就能夠

  後臺代碼

            Button button = FindViewById<Button>(Resource.Id.MyButton);
            button.Click += delegate { btn_Call(); };

 

        private void btn_Call()
        {
            /*
            報錯:權限問題
            既CALL_PHONE的權限(右鍵→屬性→Android Mainifest)
            */

            EditText et_num = FindViewById<EditText>(Resource.Id.tel_num);
            //調用系統的撥打號碼界面
            //必須是 tel 開頭的
            Intent intent = new Intent(Intent.ActionCall, Android.Net.Uri.Parse("tel:" + et_num.Text));
            //啓動撥打界面
            StartActivity(intent);
        }

   我想這個我就不解釋了,直接看註釋,我也是百度的,必需要注意的就是,在這裏的Android.Net.Uri.Parse 在這裏直接傳值是不能夠的必需要有一個tel的識別符號,而後我也試着把冒號刪除掉,也不行,雖然我用10086測試的,哈哈。

  OK,本次就到這裏,但願你們動動您的雙手,給小弟點個贊,或者給點寶貴意見也能夠。

  附:Android(Xamarin)之旅(一)

相關文章
相關標籤/搜索