Android(Xamarin)之旅(三)

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

前面兩篇說到了Xamarin的安裝和一些簡單的控件,今天來講說一些對話框和提示信息,以及簡單的佈局元素。html

1、對話框和提示信息android

  1、對話框web

      咱們首先從簡單的對話框開始。數組

      一、普通對話框網絡

      在android裏面,對話框用的是AlertDialog,這個呢,其實就和winform裏面的MessageBox同樣的。最簡單的app

AlertDialog.Builder ad_build = new AlertDialog.Builder(this)
                              .SetTitle(Resource.String.warming)//標題(警告)
                              .SetMessage(Resource.String.info)//獲取本地string.xml定義的數據
                              .SetNegativeButton("肯定", this)
                              .SetPositiveButton("取消", this)
                              .SetNeutralButton("中間按鈕", this)
                              .SetIcon(Android.Resource.Drawable.StatSysWarning);
                    ad_build.Show();

       其中,SetNeutralButton這裏是設置的一箇中間按鈕,這個東西,能夠有,也能夠沒有,代碼能夠直接添加到程序裏面運行便可。在代碼中,咱們能夠看到提示信息裏面的,  獲取本地strings.xml定義的數據。咱們能夠看下本地的xml數據。ide

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="myapp">爺的APP</string>
  <string name="info">您肯定結束本次任務?</string>
  <string name="yesorno">肯定要退出嗎?</string>
  <string name="warming">警告</string>
  <string name="jiazai">正在加載……</string>
  <string name="Img_Info">您有一個未接電話</string>
  <string name="MyToast">自定義提示信息</string>
</resources>

      在這裏,不得不說一下,這裏的SetIcon的問題,這裏的Android.Resource.Drawable這個是系統自帶的圖片,可能咱們有時候須要去訪問本地本身的圖片。佈局

      在dialog顯示gif圖片 因爲dialog不容易取到裏面空間對象,推薦使用透明樣式的activity,只需把該activity的樣式設置爲透明樣式 即android:theme="@android:style/Theme.Translucent",同時在oncreat()方法的setcontenview()以前設置requestWindowFeature(Window.FEATURE_NO_TITLE);去掉標題. 播放gif圖片 因爲android控件不支持播放gif。推薦使用webview 裏面放入html中含有img標籤 src即是圖片的地址 可使網絡地址 也能夠是本地地址 而後webview加載該html即實現了播放post

      二、單選對話框ui

      單選對話框,還用的是AlertDialog

 AlertDialog.Builder ad_build = new AlertDialog.Builder(this)
                              .SetTitle(Resource.String.warming)//標題(警告)
                              .SetSingleChoiceItems(new string[] { "中國", "日本", "韓國" }, 0, this)//自定義的單選數組
                              .SetNegativeButton("肯定", this)
                              .SetPositiveButton("取消", this)
                              .SetIcon(Android.Resource.Drawable.StatSysWarning); ad_build.Show();

       在這裏,任然能夠添加中間按鈕,直接在後面繼續加點,加Set就能夠,可是單選要實現 IDialogInterfaceOnClickListener 接口,經過這個接口,咱們能夠獲取到如今選擇的究竟是哪個的值。其實,單選就是多了一個SetSingleChoiceItems這個參數,而後傳值就能夠。

        /// <summary>
        /// 單選和普通對話框
        /// </summary>
        /// <param name="dialog"></param>
        /// <param name="which"></param>
        public void OnClick(IDialogInterface dialog, int which)
        {
            Toast.MakeText(this, which + "", ToastLength.Short).Show();
        }

       這裏的which就是選擇的是哪個的值,獲取到值通常來講纔是最重要的,咱們才能夠繼續其餘的事情。

      三、多選對話框

      多選對話框,還用的是AlertDialog

  AlertDialog.Builder ad_build = new AlertDialog.Builder(this)
                             .SetTitle(Resource.String.warming)//標題(警告)
                             .SetMultiChoiceItems(new string[] { "中國", "日本", "韓國" }, new bool[] { false, true, true }, this)//多選自定義數組
                             .SetNegativeButton("肯定", this)
                             .SetPositiveButton("取消", this)
                             .SetIcon(Android.Resource.Drawable.StatSysWarning);
                    ad_build.Show();

       其中,多選框實現的 IDialogInterfaceOnMultiChoiceClickListener 是這個接口。

     /// <summary>
        /// 多選接口的實現
        /// </summary>
        /// <param name="dialog"></param>
        /// <param name="which"></param>
        /// <param name="isChecked"></param>
        public void OnClick(IDialogInterface dialog, int which, bool isChecked)
        {
            Toast.MakeText(this, which.ToString() +"    "+ isChecked.ToString(), ToastLength.Short).Show();
        }

       一樣的,這裏的which是在這個多選框中的惟一ID,後面的isChecked,是否選擇,經過這些,咱們就能夠獲取到不少信息了。

      四、正在加載對話框

      正在加載用的是ProgressDialog 這個方法,這個方法一樣能夠 Builder,可是和SetIcon同樣,若是想採起自定義的圖片,一樣須要前面的圖片自定義的辦法。

          ProgressDialog p_dialog = new ProgressDialog(this);
          p_dialog.SetMessage("正在加載……");
          p_dialog.Show();            

       這個效果就是登錄或者其餘的那個,若是這裏用 ProgressDialog.Builder 也是能夠,可是要自定義顯示信息,包括圖片信息等等。

      五、自定義對話框

      這裏自定義對話框用的仍是AlertDialog,可是不一樣的是,自定義的對話框,要注意。自定義對話框,要徹底自定義佈局,也就是說,要徹底定義全部的相關信息,這就至關於咱們作web的時候,填出一個提示框同樣,在Android裏面,要徹底彈出自定義對話框,哪就須要View,由於全部的界面都是View,直接右鍵添加一個Android Layout就能夠,哇咔咔,繼續開始設計。

      個人界面是這樣定義的:

<?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">
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="系統提示"
        android:background="#0094FF"
        android:textColor="#ffffff" />
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:background="#848484">
    <!--@android:drawable/stat_notify_missed_call 引用的是系統的圖片-->
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@android:drawable/stat_notify_missed_call" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="一個未接電話" />
    </LinearLayout>
</LinearLayout>

      OK,這裏要注意一點 關於 ImageView 的 src 的問題 android:src="@drawable/myapk" 這麼寫,引用的本地定義的myapk的圖片,最好能是 png、jpg等等此類的,要是gif的好像仍是要從新加載一下,這裏的引用也就是本身在 drawable 文件夾添加的圖片的 名字。 @android:drawable/stat_notify_missed_call 這麼寫就是引用的 Android SDK文件夾下面的 drawable 的文件,這些文件你得先找到你本身的文件安裝路徑,也就是你定義的SDK的安裝路徑,找到安裝路徑以後,platformsandroid-15→data→res→drawable-ldpi 在這個文件夾下面,你就能夠看到不少圖片了,若是實在找不到,你仍是用Android Studio安裝的話,我告訴一個好消息,SDK Manager (sdk管理器)或者 AVD Manager (虛擬機管理器)的快捷方式,找到安裝的根目錄,這個能夠作到吧。

      如圖,找到對應的文件夾,依次按照platforms→android-15→data→res→drawable-ldpi 這個順序往下點擊就能夠了,你就能看到你想要的了。

      後臺代碼:

                    View view = LayoutInflater.From(this).Inflate(Resource.Layout.MyDialog, null);
                    AlertDialog.Builder a_bulid = new AlertDialog.Builder(this);
                    a_bulid.SetMessage("自定義對話框").SetView(view);
                    a_bulid.Show();

      先用View來接收我剛定義的界面,而後給這個界面設置一個標題,而後直接用 AlertDialog 直接 Show 就能夠,其中 LayoutInflater 這就是一點要注意的,這個和自己的 FindViewById就是一個相同的意思,一個找佈局文件,一個找界面元素。

      六、列表對話框

      列表對話框用的仍是AlertDialog

      

 AlertDialog.Builder ad_build = new AlertDialog.Builder(this)
                             .SetTitle(Resource.String.warming)//標題(警告)
                             .SetItems(new string[] { "中國", "日本", "韓國" }, this)
                             .SetNegativeButton("肯定", this)
                             .SetPositiveButton("取消", this)
                             .SetIcon(Android.Resource.Drawable.StatSysWarning);
                    ad_build.Show();

       這裏不一樣的就是列表對話框用的是 SetItems 這個屬性

    2、提示信息

      一、普通提示信息

                    var item = Toast.MakeText(this, Resource.String.info, ToastLength.Short);
                    //設置垂直水平居中
                    item.SetGravity(GravityFlags.CenterHorizontal | GravityFlags.CenterVertical, 0, 0);
                    item.Show();

       這裏的其實沒有什麼注意的,就是一個 SetGravity 設置顯示的位置的屬性。

      二、含圖片提示信息

            var item = Toast.MakeText(this, Resource.String.Img_Info, ToastLength.Short);
                    //建立一個圖片視圖
                    ImageView iv = new ImageView(this);
                    iv.SetImageResource(Android.Resource.Drawable.StatNotifyMissedCall);
                    //獲得Toast佈局(強制改變爲線型佈局)
                    LinearLayout toastView = (LinearLayout)item.View;
                    //設置內容顯示位置
                    toastView.SetGravity(GravityFlags.Center);
                    //設置佈局的方向
                    //
                    //Orientation.Horizontal 居於屏幕下方
                    //Orientation.Horizontal | Orientation.Vertical
                    //
                    toastView.Orientation = Orientation.Horizontal;
                    //給佈局添加一個視圖,而且設置位置
                    toastView.AddView(iv, 0);
                    //顯示Toast
                    item.Show();

      三、徹底自定義提示信息

                    View view = LayoutInflater.From(this).Inflate(Resource.Layout.MyDialog, null);
                    Toast toast = new Toast(this);
                    toast.View = view;
                    toast.Show();

       看到這裏,相信你們都有一個簡單的瞭解了,我作了一個簡單的反思,就是Android的這個東西,當你要呈現一個新的元素或者其餘的任務之類的,都須要去單獨接受,感受和委託的意思同樣,是這樣嗎?

 

2、佈局

     在android裏面,不一樣的像素密度,通常使用的是dip作單位的,文字使用的是sp

            AbsoluteLayout 絕對佈局(全部的信息都是寫死的)

            FramerLayout 幀佈局 這個佈局全部的東西都是從左上角開始的,就是會疊加顯示,不會像div那樣擠壓

            LinearLayout  線程佈局(默認)默認從上到下依次
            android:orientation 設置佈局方向  
            horizontal 水平均分
            layout_weight 在相同的狀況下,呈現的是正好是對立的狀態,在同一個線型佈局裏面就能夠看到,

            帶有layout_的都指的的是父空間的樣式
            如 layout_gravity 指的是本身在父控件裏面對齊樣式 gravity    就是自己本身的樣式

            RelativeLayout 該佈局是參照父控件或者是其餘控件的位置進行佈局。好比說我要把A控件 ,放到B控件的下面,而且A控件的右邊與B的左邊對齊。相似這樣的佈局就可使用相對佈局來完成比較容易

            fill_parent 填滿當前視圖,在2.2以後的android版本 match_parent 便可(相同的意思)
            wrap_content 設置一個視圖的尺寸爲wrap_content將強制性地使視圖擴展以顯示所有內容。

    TableLayout 佈局頁面

     單元格屬性:
          android:layout_column:指定該單元格在第幾列顯示(從0開始)
          android:layout_span:跨列(意思就是當前的控件佔據單元格多少列)

          列屬性:
          android:stretchColumns    設置可伸展的列。該列能夠向行方向伸展,最多可佔據一整行。
          android:shrinkColumns    設置可收縮的列。當該列子控件的內容太多,已經擠滿所在行,那麼該子控件的內容將往列方向顯示。
          android:collapseColumns    設置要隱藏的列。

    本人對於佈局就是個菜,原本就很不擅長作佈局,No,不能用這個詞,用這個詞瞬間拉低了擅長這個詞的身價,這樣吧,我本身摸索的幾個簡單的佈局,能夠你們參考,參考

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:id="@+id/absoluteLayout1">
<!--android:orientation 設置的線型佈局的方向-->
<!--在android裏面,不一樣的像素密度,通常使用的是dip作單位的,文字使用的是sp-->
<!--layout_weight 在相同的狀況下,呈現的是正好是對立的狀態-->
    <Button
        android:id="@+id/MyButton1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="按鈕一"
        android:layout_weight="3" />
    <Button
        android:id="@+id/MyButton2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="按鈕二"
        android:layout_weight="3" />
    <Button
        android:id="@+id/MyButton3"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="按鈕三"
        android:layout_weight="3" />
</LinearLayout>

 效果圖:

 

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <EditText
        android:id="@+id/edit"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="下面有個按鈕" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按鈕"
        android:layout_below="@id/edit"
        android:layout_alignRight="@id/edit" />
</RelativeLayout>

 效果圖

 

來個帶後臺代碼的。  

  

<?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">
<!--wrap_content 包裹內容-->
<!--horizontal 水平-->
<!--android:layout_height="wrap_content" 橫向包裹內容-->
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
        <Button
            android:id="@+id/home"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="首頁" />
        <Button
            android:id="@+id/jiankang"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="第二個頁面" />
        <Button
            android:text="第三個"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:id="@+id/button1" />
    </LinearLayout>
    <FrameLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <LinearLayout
            android:id="@+id/layout1"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <TextView
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:text="第一個佈局"
                android:background="#0094ff" />
        </LinearLayout>
        <LinearLayout
            android:id="@+id/layout2"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <TextView
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:text="第二個佈局"
                android:background="#0045ff" />
        </LinearLayout>
        <LinearLayout
            android:id="@+id/layout3"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:text="第三個佈局"
                android:textSize="24sp"
                android:id="@+id/tv1" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:textSize="36sp"
                android:id="@+id/tv2"
                android:gravity="center" />
        </LinearLayout>
    </FrameLayout>
</LinearLayout>

 後臺代碼

    public class MainActivity : Activity, View.IOnClickListener
    {
        public void OnClick(View v)
        {
            LinearLayout layout3 = FindViewById<LinearLayout>(Resource.Id.layout3);
            LinearLayout layout2 = FindViewById<LinearLayout>(Resource.Id.layout2);
            LinearLayout layout1 = FindViewById<LinearLayout>(Resource.Id.layout1);
            if (v.Id == Resource.Id.home)
            {
                layout1.Visibility = ViewStates.Visible;
                layout2.Visibility = ViewStates.Invisible;
                layout3.Visibility = ViewStates.Invisible;
            }
            if (v.Id == Resource.Id.jiankang)
            {
                layout2.Visibility = ViewStates.Visible;
                layout1.Visibility = ViewStates.Invisible;
                layout3.Visibility = ViewStates.Invisible;
            }

            if (v.Id == Resource.Id.button1)
            {
                layout3.Visibility = ViewStates.Visible;
                layout1.Visibility = ViewStates.Invisible;
                layout2.Visibility = ViewStates.Invisible;
            }
        }

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            // Set our view from the "main" layout resource


            //  RelativeLayout
            //該佈局是參照父控件或者是其餘控件的位置進行佈局。好比說我要把A控件
            //放到B控件的下面,而且A控件的右邊與B的左邊對齊。相似這樣的佈局就可
            //以使用相對佈局來完成比較容易
            SetContentView(Resource.Layout.line);

            /*
            // 相對於給定ID控件
                android:layout_above 將該控件的底部置於給定ID的控件之上;
                android:layout_below 將該控件的底部置於給定ID的控件之下;
                android:layout_toLeftOf    將該控件的右邊緣與給定ID的控件左邊緣對齊;
                android:layout_toRightOf  將該控件的左邊緣與給定ID的控件右邊緣對齊;
 
                android:layout_alignBaseline  將該控件的baseline與給定ID的baseline對齊;
                android:layout_alignTop        將該控件的頂部邊緣與給定ID的頂部邊緣對齊;
                android:layout_alignBottom   將該控件的底部邊緣與給定ID的底部邊緣對齊;
                android:layout_alignLeft        將該控件的左邊緣與給定ID的左邊緣對齊;
                android:layout_alignRight      將該控件的右邊緣與給定ID的右邊緣對齊;
                // 相對於父組件
                android:layout_alignParentTop      若是爲true,將該控件的頂部與其父控件的頂部對齊;
                android:layout_alignParentBottom 若是爲true,將該控件的底部與其父控件的底部對齊;
                android:layout_alignParentLeft      若是爲true,將該控件的左部與其父控件的左部對齊;
                android:layout_alignParentRight    若是爲true,將該控件的右部與其父控件的右部對齊;
                // 居中
                android:layout_centerHorizontal 若是爲true,將該控件的置於水平居中;
                android:layout_centerVertical     若是爲true,將該控件的置於垂直居中;
                android:layout_centerInParent   若是爲true,將該控件的置於父控件的中央;
                // 指定移動像素
                android:layout_marginTop      上偏移的值;
                android:layout_marginBottom 下偏移的值;
                android:layout_marginLeft   左偏移的值;
                android:layout_marginRight   右偏移的值;

            */

            /*
            設置line簡單佈局
            Introduce/Test007 佈局說明.txt
            */
            //SetContentView(Resource.Layout.line);
            //layoutExample();

        }
        /// <summary>
        /// Line佈局
        /// </summary>
        private void layoutExample()
        {
            Button btn = FindViewById<Button>(Resource.Id.home);
            btn.SetOnClickListener(this);
            Button btn1 = FindViewById<Button>(Resource.Id.jiankang);
            btn1.SetOnClickListener(this);
            Button bt1 = FindViewById<Button>(Resource.Id.button1);
            bt1.SetOnClickListener(this);
        }
    }

 

    原諒我,神呀,就這樣了,對了,給你們留下點源碼,解壓以後,能夠看到有一個test007和test011,其中011包含了前面所說到的全部的提示信息和消息框。007裏面就是一些讓正常人看着頭疼的佈局,額,相信我,好吧,不過你能夠運行一下007的源碼,點擊一下那幾個按鈕,額,仍是能夠的麼。

百度網盤連接:http://pan.baidu.com/s/1jHpbEoI 密碼:afqf

前面兩篇隨筆的地址:

Android(Xamarin)之旅(一)

相關文章
相關標籤/搜索