前面两篇说到了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
前面两篇随笔的地址: