Mono
for Android ³õÌåÑ飬 ѧϰÔõôʹÓà Mono for Anrdoid ´´½¨ android
Ó¦Ó㬠ÈçºÎʹÓà Intent Æô¶¯ Activity £¬ ÈçºÎÔÚ Activity Ö®¼ä´«µÝ²ÎÊý¡£
×¼±¸¿ª·¢»·¾³
ÏÂÔØ²¢°²×° Mono for Android
ÔÚ OSX ϵͳÏÂ×¼±¸ Mono for Android ¿ª·¢»·¾³Ê±±È½ÏÈÝÒ׵ģ¬ ֻҪȥ Xamarin
ÏÂÔØÒ»¸öÔÚÏß°²×°³ÌÐò£¬ °²×°³ÌÐò»á×Ô¶¯ÏÂÔØ²¢°²×°ËùÓеÄÎļþ£¬ ÉõÖÁ°üÀ¨ JDK¡¢ Android SDK
µÈ£¬ ûʲôºÃ˵µÄ£¬ Ò»¾ä»°£¬ ºÜ¼òµ¥¡£
ÅäÖà Android Ä£ÄâÆ÷
Æô¶¯ MonoDevelop £¬ ÔÚ Tools ²Ëµ¥ÏÂÕÒµ½µã»÷ ¡°Open AVD Manager¡±
£¬ ½«»áÆô¶¯ ¡°Android Virtual Device Manager¡±£¬ ´´½¨Ò»¸öÐ嵀 Android
ÐéÄâÉ豸£¬ Name Ϊ Droid4.1£¬ Target Ñ¡Ôñ 4.1£¬ SD ¿¨Ñ¡Ôñ 256£¬ Skin
Ñ¡ÔñÄÚÖÃµÄ WXGA720 £¬ µÈµÈ£¬ Ò»ÇпÉÒԲο¼ Google µÄÎĵµ¡£
ÐèҪעÒâµÄÊÇ£¬ ÒªÌí¼ÓÒ»¸öÓ²¼þÑ¡Ïî GPU emulation £¬ ²¢ÉèÖÃΪ true £¬ ¿ªÆô GPU
Ä£Ä⣬ ¿ÉÒÔ¼Ó¿ìÄ£ÄâÆ÷ÔËÐÐËÙ¶È£¬ ·ñÔòÄ£ÄâÆ÷ÔËÐÐÕæµÄ»áºÜÂý¡£
´´½¨ºÃÁËÖ®ºó£¬ ÏÈÔËÐÐÒ»ÏÂÄ£ÄâÆ÷£¬ È·ÈÏÒ»ÇÐÅäÖÃÕý³£ÁË£¬ Õû¸ö¿ª·¢»·¾³¾ÍËã×¼±¸ºÃÁË¡£
´´½¨ Mono for Android Ó¦ÓÃ
´ò¿ª MonoDevelop £¬ Ñ¡Ôñн¨½â¾ö·½°¸£¬ ×ó±ßµÄ·ÖÀàÑ¡Ôñ "Mono for Android"
£¬ ÓÒ±ßÑ¡Ôñ "Mono for Android Application" £¬ ʹÓÃĬÈϵÄÄ£°åн¨Ò»¸ö
Mono for Android Ó¦ÓóÌÐò£¬ ÈçÏÂͼËùʾ£¬ ÏîÄ¿Ãû³ÆÎª ¡°MyFirstApp¡± ¡£

ÊìϤĬÈÏÏîĿģ°å
ÏÖÔÚ£¬ ÏȲ»Òª×öÆäËüµÄ£¬ ÏÈÀ´ÊìϤһÏÂÕâ¸öÏîÄ¿£¬ ´ò¿ªÏîÄ¿ÊôÐÔ¶Ô»°¿ò£¬
¿´¿´Ã¿¸ö½Úµã¶¼ÓÐʲôÉèÖÃÏ ÖØµãÊìϤÏÂÃæ¼¸¸ö½Úµã£º
Build/General £¬ Ñ¡Ôñ Target Framework
£¬ÉèÖñàÒëÓ¦ÓÃʹÓÃµÄ Android SDK °æ±¾£»
Build/Mono for Android Build £¬ ÉèÖÃÈç
Linker ¡¢ ²¿Êð·½Ê½¡¢ ÒÔ¼°¸ß¼¶±êÇ©ÏÂµÄµÄ CPU¼Ü¹¹¡¢ ¹ú¼Ê»¯µÈ£»
Build/Mono for Android Application
£¬ ÉèÖÃÓ¦ÓóÌÐòÐÅÏ¢£¬ Ò²¾ÍÊÇ AndroidManifest.xml ÎļþµÄÐÅÏ¢£»
ÏîĿĬÈϵÄĿ¼½á¹¹ÈçÏÂÈçËùʾ£º

×¢Òâ Assets ºÍ Resource Ŀ¼£º
Assets Ŀ¼£¬ Èç¹ûÓ¦ÓÃÐèÒªÓõ½¶þ½øÖÆ×ÊÔ´Îļþ£¬ ±ÈÈçÌØÊâ×ÖÌå¡¢ÉùÒôµÈ£¬ ·ÅÔÚÕâ¸öĿ¼Ï£¬ ²¢½«
BuildAction ÉèÖÃΪ AndrioidAsset £¬ ×ÊÔ´½«»áºÍÓ¦ÓóÌÐòÒ»Æð²¿Ê𣬠ÔÚÔËÐÐʱ¿ÉÒÔͨ¹ý
AssetManager ʹÓÃÀàËÆÏÂÃæµÄ´úÂë½øÐзÃÎÊ£º
public class ReadAsset : Activity { protected override void OnCreate (Bundle bundle) { base.OnCreate (bundle); InputStream input = Assets.Open ("my_asset.txt"); } }
|
ÁíÍ⣬×ÖÌåÎļþ¿ÉÒÔÕâÑù¼ÓÔØ£º
Typeface tf = Typeface.CreateFromAsset( Context.Assets, "fonts/samplefont.ttf");
|
Resource Ŀ¼, °üº¬Ó¦ÓóÌÐòËùÐèµÄͼƬ¡¢ ²¼¾ÖÃèÊö¡¢ ¶þ½øÖÆÎļþºÍ×Ö·û´®×ÖµäµÈ×ÊÔ´Îļþ¡£ ±ÈÈ磬
Ò»¸ö¼òµ¥µÄ Android Ó¦Óðüº¬Ò»¸ö½çÃæÃèÊöÎļþ (main.axml) £¬ Ò»¸ö¹ú¼Ê»¯µÄ×Ö·û´®×Öµä
(strings.xml) ÒÔ¼°Í¼±ê (icon.png) £¬ ÕâЩÎļþ°´ÕÕÏÂÃæµÄ½á¹¹±£´æÔÚ ¡°Resource¡±
Ŀ¼ÄÚ£º
Resources/ drawable/ icon.png layout/ main.axml values/ strings.xml
|
ΪÁËÈñàÒëϵͳÄܹ»½«×ÊÔ´Îļþʶ±ð³ö Android ×ÊÔ´£¬ ÐèÒª½«Æä±àÒ붯×÷ (Build Action)
ÉèÖÃΪ ¡°Android Resource¡±¡£ ÉÏÃæµÄĿ¼½á¹¹¾¹ý±àÒëÖ®ºó£¬ ½«»áÉú³ÉÀàËÆÏÂÃæµÄÎļþ£º
public class Resource {
public class Drawable {
public const int icon = 0x123;
}
public class Layout {
public const int main = 0x456;
}
public class Strings {
public const int FirstString = 0xabc;
public const int SecondString = 0xbcd;
}
}
|
ʹÓà Resource.Drawable.icon ¿ÉÒÔÒýÓà drawable/icon Îļþ£¬ Resource.Layout.main
¿ÉÒÔÒýÓà /layout/main.axml Îļþ£¬ ¶øÊ¹Óà Resource.Strings.FirstString
Ôò¿ÉÒÔÒýÓà values/strings.xml ÎļþÖеĵÚÒ»¸ö×Ö·û´®¡£
ÒÔÉÏÕâЩºÍ Android SDK ÎĵµÖнéÉܵͼÊÇ´óͬСÒìµÄ£¬ ÔÚ Mono for Android
»·¾³ÏÂÓÖ¼ÓÉÏÁËһЩ .Net ÌØÓеķç¸ñ¶øÒÑ£¬ ¶ÔÓÚÓоÑéµÄ .Net ¿ª·¢ÈËÔ±À´Ëµ£¬ Ò»¿´¾Í¶®ÁË¡£
´´½¨ Activity ¼° View
ÓëÆäËüƽ̨µÄÓ¦ÓóÌÐò²»Í¬£¬ ÕâЩƽ̨ÉϵÄÓ¦ÓóÌÐòͨ³£¶¼ÓÐÒ»¸öµ¥Ò»µÄÈë¿Ú main º¯Êý£¬ Ó¦ÓóÌÐò¶¼ÓÉÕâ¸öÈë¿Úº¯ÊýÆô¶¯£¬
´´½¨´°¿Ú¡¢ ά»¤½çÃæ¡£ ¶ø Android ³ÌÐòÔò²»Í¬£¬ Ò»¸ö Android ³ÌÐòÓÉһЩËÉÉ¢µÄ Activity
ÌṩµÄ½çÃæ×é³É£¬ Òò´Ë¿´ÆðÀ´Óеã¶ùÏñ Web Ó¦ÓóÌÐò£¬ ÈκÎÒ»¸ö Activity ¶¼¿ÉÒÔͨ¹ý URL
Æô¶¯¡£
ÏÖÔÚÀ´Ð½¨Ò»¸ö Activity £¬ Ôڲ˵¥À¸ÉÏÑ¡Ôñ File -> New -> File
£¬ ÔÚµ¯³öµÄн¨Îļþ¶Ô»°¿òÖÐÑ¡Ôñ Android Activity £¬ ÈçÏÂͼËùʾ£º

н¨µÄ Activity µÄ´úÂëÈçÏ£º
[Activity(Label = "MyFirstApp", MainLauncher = true)] public class MainActivity : Activity {
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
}
}
|
×¢Òâ MainActivity µÄ ActivityAttribute ±ê¼Ç£¬ ÕâÀïÖ¸¶¨ÁËÁ½¸öÊôÐÔ£¬
Label="MyFirstApp" ±íʾ Activity µÄÏÔʾÃû³Æ£¬ MainLauncher=true
±íʾÔÚÓ¦ÓóÌÐòÁбíÖÐÏÔʾ£¬ ÔÚ±àÒëʱ£¬ Mono for Android »á¸ù¾ÝÕâЩ±ê¼ÇÉú³ÉÒ»¸ö AndroidManifest.xml
£¬ ²¢´ò°üµ¹×îÖÕµÄ Android Ó¦ÓóÌÐòÖС£
ÏÖÔÚÀ´´´½¨ MainActivity µÄÊÓͼ£¬ ÏÈÑ¡ÖÐÏîÄ¿µÄ Resources/layout Ŀ¼£¬
Ôڲ˵¥À¸ÉÏÑ¡Ôñ File -> New -> File £¬ ÔÚµ¯³öµÄн¨Îļþ¶Ô»°¿òÖÐÑ¡Ôñ Android
Layout £¬ ÈçÏÂͼËùʾ£º

ÎļþÃûÊäÈë MainActivityLayout £¬ MonoDevelop ĬÈÏ»á´ò¿ªÉè¼ÆÊÓͼ£¬ ÏÈÇл»µ½´úÂëÊÓͼ£¬
Õ³ÌùÏÂÃæµÄ´úÂ룺
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:layout_width="0dp" android:layout_height="wrap_content" android:id="@+id/MessageEditText" android:layout_weight="1" android:hint="@string/MessageEditTextHint" /> <Button android:text="@string/SendButtonText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/SendButton" /> </LinearLayout>
|
È»ºóÇл»µ½Éè¼ÆÊÓͼ£¬ ¿´ÆðÀ´ÈçÏÂͼËùʾ£º

ÔÚ MainActivity.cs ÎļþÖÐµÄ base.OnCreate(bundle) ÏÂÃæ¼ÓÈëÏÂÃæÒ»¾ä´úÂ룬
Èà MainActivity ʹÓà MainActivityLayout £º
this.SetContentView(Resource.Layout.MainActivityLayout);
|
ÓÃͬÑùµÄ·½·¨£¬ ´´½¨ SecondActivity ÒÔ¼° SecondActivityLayout £¬
SecondActivityLayout µÄ´úÂëÒÔ¼°Éè¼Æ½çÃæÈçÏ£º
<?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"> <TextView android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/MessageTextView" /> </LinearLayout>
|

ʹÓà Intent Æô¶¯ Activity ²¢´«µÝ²ÎÊý
Èç¹ûÏÖÔÚÔËÐгÌÐò£¬ ½«Ö»ÄÜ¿´µ½ MainActivity £¬ ¿´²»µ½ SecondActivity £¬
Èç¹ûÒªÏëÆô¶¯ SecondActivity £¬ ¾ÍÐèÒªÓõ½ Intent ¡£ Android ͨ¹ý Intent
À´Æô¶¯ Activity £¬ ÒÔ¼°ÔÚ Activity Ö®¼ä´«µÝ²ÎÊý¡£
´ò¿ª MainActivity £¬ Ìí¼ÓһЩ´úÂ룬 ʹÆä¿´ÆðÀ´ÈçÏÂËùʾ£º
[Activity(Label = "MyFirstApp", MainLauncher = true)] public class MainActivity : Activity {
public const string ExtraMessage = "Cn.Beginor.MyFirstApp.MainActivity.ExtraMessage";
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// ÉèÖò¼¾ÖÎļþ
this.SetContentView(Resource.Layout.MainActivityLayout);
var sendBtn = this.FindViewById<Button>(Resource.Id.SendButton);
// Ϊ·¢ËͰ´Å¥Ìí¼Óʼþ´¦Àíº¯Êý
sendBtn.Click += SendButtonClick;
}
void SendButtonClick (object sender, EventArgs
e) {
// »ñÈ¡Óû§ÊäÈëµÄÐÅÏ¢
var msgEditText = this.FindViewById<EditText>(Resource.Id.MessageEditText);
if (msgEditText == null) {
return;
}
var msg = msgEditText.Text;
// ´´½¨ Intent ²¢´«µÝÓû§ÊäÈëµÄÐÅÏ¢
var intent = new Intent(this, typeof(SecondActivity));
intent.PutExtra(ExtraMessage, msg);
// Æô¶¯µÚ¶þ¸ö Activity
this.StartActivity(intent);
}
}
|
ÔÙ´ò¿ª SecondActivity £¬ Ìí¼Ó½ÓÊÕ ExtraMessage ²¢ÏÔʾµÄ´úÂ룺
protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); // ÉèÖò¼¾ÖÎļþ this.SetContentView(Resource.Layout.SecondActivityLayout); // ´Ó Intent ÖлñÈ¡ ExtraMessage var intent = this.Intent; var msg = intent.GetStringExtra(MainActivity.ExtraMessage); // ½« ExtraMessage ÏÔʾÔÚ TextView ÉÏ var textView = this.FindViewById<TextView>(Resource.Id.MessageTextView); textView.Text = msg; }
|
ÏÖÔÚÔËÐÐÕâ¸ö³ÌÐò£¬ ¿ÉÒÔ¿´µ½Ê×ÏÈÆô¶¯µÄÊÇ MainActivity £¬ ÏÔʾ½çÃæÈçÏ£º

µã»÷ Send °´Å¥£¬ »áÆô¶¯ SecondActivity £¬ ²¢½«ÊäÈëµÄÐÅÏ¢ÏÔʾÔÚ½çÃæÉÏ£º

×ܽá
Mono for Android ³õÌåÑé¸Ð¾õ²»´í£¬ ¶ÔÓÚÓоÑéµÄ .Net ¿ª·¢ÈËÔ±À´½²£¬ ÉÏÊÖµÄËٶȷdz£¿ì£¬
Ö»ÒªÉÔ΢ѧϰһÏ Android µÄ UI ·½ÃæµÄ֪ʶ¾Í¿ÉÒÔÁË¡£ MonoDevelop µÄ½çÃæºÍ VS
ºÜÏàËÆ£¬ ÉÏÊÖÒ²ÊǺÜÈÝÒ×µÄÊÂÇé¡£ »¹ÊÇÄǾ仰£¬ Mono for Android ×î´óµÄºÃ´¦ÊÇ¿ÉÒÔÀûÓÃÏÖÓеÄ
.Net ´úÂ룬 CodePlex ÒÔ¼° Github ÉÏÓзḻµÄ×ÊÔ´¿ÉÒÔÀûÓ㬠Èç¹ûÄãÊìϤ .Net
¿ª·¢£¬ Mono for Android Ò²ÊÇÖµµÃÒ»ÊԵġ£
|