一、数据组件
1、数据适配器
界面我们直接在左侧工具栏拖一个ListView过来,然后通过后台绑定数据。
var
list =
new
List
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(Resource.Id.listView1);
listview.Adapter = sam_adapter;
解释一下这里的List
在Android里面,类似这样的,都需要一个数据适配器,就是这里的listview.Adapter,我们通过FindViewById
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,第二个参数就引用了系统的布局。
2、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(Resource.Id.spinner1);
sp.Adapter = a_adaper;
sp.SetPromptId(Resource.String.Title);
这里的 SetPromptId 就是通过这个设置一个标题,这里呢,我是自己的 strings.xml 文件中定义的一个常量。
3、GridView
直接利用前面说到的数据控件 SimpleAdapter ,直接在界面上拖拽一个 GridView过来即可。
var
list_dic =
new
List
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(Resource.Id.gridView1);
gv1.Adapter = sam_adapter;
还是同时通过适配器 Adapter 来绑定数据。
附:GridView的一些属性(其实百度随便就能找到)
使用android:numColumns设置列数
使用android:columnWidth设置每列宽度
如果把android:numColumns的值改成”auto_fit”,配合android: columnWidth能自适应。
使用android:horizontalSpacing设置没列间距
使用android:verticalSpacing设置每行间距
二、意图
Intent 具体想要做什么
1、基本跳转
我们首先来建立一个基本页面,来实现接收。
在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获取这个变量。
直接启动就可以在虚拟机里面看到效果了。
2、实现隐式意图
在跳转的基础上,我们在 Activity1 的这个活动页面上,添加过滤器,这个过滤器的位置,要添加在 public class Activity1 : Activity ,IDialogInterfaceOnClickListener 这句代码的前面。
//创建隐式视图
//只处理和http有关系的
[IntentFilter(
new
string
[] { Intent.ActionView }, Categories =
new
string
[] { Intent.CategoryDefault }, DataScheme =
"http"
)]
public
class
Activity2 : Activity,IDialogInterfaceOnClickListener
{
protected
override
void
OnCreate(Bundle savedInstanceState)
{
base
.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.layout1);
ImageButton ibtn = FindViewById(Resource.Id.imageButton1);
ibtn.Click +=
delegate
{ url(); };
public
void
OnClick(IDialogInterface dialog,
int
which)
Toast.MakeText(
this
, which +
""
, ToastLength.Short).Show();
}
通过这里的注释我们就可以看明白,这个是什么意思了,这里就是添加一个打开 网页时的 隐式意图,比如我们的手机系统里面安装了好多个浏览器,我的手机里面不是有 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,到这里启动,当我们跳转过来,然后点击这个页面的时候,我们是不是可以有一个选择了。
三、广播
广播这个我不知道怎么解释了,简单的说一下,就是说,比如我们要打开软件的时候,然后直接跳转到开始界面的时候,某一些应用程序会告诉你,已经转到后台运行,这个广播的意思就是说,我们同样有这么一个唯一标示被监听,广播的目的就是监听事件。
具体可以参考:http://www.cnblogs.com/qianlifeng/archive/2011/03/06/1972305.html
我们直接添加一个项目。界面代码如下:
"1.0"
encoding=
"utf-8"
?>
"http://schemas.android.com/apk/res/android"
android:orientation=
"vertical"
android:layout_width=
"fill_parent"
android:layout_height=
"fill_parent"
>
android:id=
"@+id/MyButton"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:text=
"@string/Hello"
/>
android:id=
"@+id/Register"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:text=
"注册广播"
/>
android:id=
"@+id/Cancel"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:text=
"取消注册"
/>
android:id=
"@+id/Send"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:text=
"发送广播"
/>
android:text=
"Text"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:textSize=
"24sp"
android:id=
"@+id/textView1"
/>
后台的 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;
//广播实例
///
/// 拨号界面
///
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.Click +=
delegate
{ button.Text =
string
.Format(
"{0} clicks!"
, count++); };
//注册
Button btn_register = FindViewById
btn_register.Click += Btn_register_Click;
//取消
Button btn_cancel = FindViewById
btn_cancel.Click +=
delegate
{ UnregisteLinster(); };
//发送广播
Button btn_send = FindViewById
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);
}
///
/// 继承
///
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广播接收器。