前面兩篇說到了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的安裝路徑,找到安裝路徑以後,platforms→android-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
前面兩篇隨筆的地址: