Mono-for-Android-Create-apps-for-Android-devices-using-C-and-.NET_

Intellisense für Mono for Android GUI’s

Seit nun einem halben Jahr arbeite ich mit MonoForAndroid um Android Applikationen zu entwickeln. Seit der Beta Phase Anfangs Januar hat sich viel getan. Ich selbst finde aber immer noch, dass sich im Gegensatz zum MonoTouch Framework, zu wenig verändert. Natürlich muss man auch berücksichtigen, dass Novell seine Mitarbeiter gefeuert hat und diese ein neues Unternehmen aufbauen mussten. Doch als .net Entwickler bin ich mir heutzutage ein bisschen Komfort gewöhnt und so verwundert es mich, warum noch kein gescheiter Android GUI Designer auf dem Markt ist.

Für Java Entwickler gibt es mindestens zwei nennenswerte: DroidDraw und der Basic4PPC Designer

Ich persönlich designe meine Anwendung meistens im DroidDraw. Da ich von dem Designer aber “nur” die AXML Datei bekomme habe ich in meiner IDE kein Intellisense zur Verfügung. Und bei vielen GUI Elementen wird auch das “FindViewById” extrem mühsam.

AXML Code Generator

Deshalb habe ich ein Projekt bei Codeplex gestartet, welches den AXML Code analysiert und eine C# Klasse dazu erstellt. Diese kann dann als Designer Klasse verwendet werden. Dieses Projekt ermöglicht dann folgenden Entwicklungsprozess:


Der AXML Code Generator erstellt alle Variablen aus der AXML Datei in C# und linkt sie direkt mit der bestimmten View.  Um das ganze auch zu demonstrieren habe ich folgendes Beispiel vorbereitet:

login.axml

<?xml version="1.0" encoding="utf-8"?> <AbsoluteLayout android:id="@+id/widget34" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" > <Button android:id="@+id/btnTest" android:layout_width="84px" android:layout_height="wrap_content" android:text="Login" android:layout_x="200px" android:layout_y="142px" > </Button> <EditText android:id="@+id/etUsername" android:layout_width="265px" android:layout_height="wrap_content" android:textSize="18sp" android:layout_x="20px" android:layout_y="82px" > </EditText> <TextView android:id="@+id/twTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Username:" android:layout_x="20px" android:layout_y="42px" > </TextView> </AbsoluteLayout>

Das ist das Layout meiner Login Klasse. Dieser Code wurde im DroidDraw erstellt und generiert. Nun Konvertiere ich diesen in eine C# Klasse mit dem AXML Code Generator:

MainActivity.Designer.cs

using Android.App; using Android.Widget; namespace AXMLMonoGUITest { partial class MainActivity : Activity { private Button btnTest; private EditText etUsername; private TextView twTitle; private void Initialize() { SetContentView(Resource.Layout.login); btnTest = FindViewById<Button>(Resource.Id.btnTest); etUsername = FindViewById<EditText>(Resource.Id.etUsername); twTitle = FindViewById<TextView>(Resource.Id.twTitle); } } }

Die Initialize() Funktion wird nun von meiner MainActivity aufgerufen. Hier ein Beispiel meiner MainActivity:

MainActivity.cs

using System; using Android.App; using Android.OS; using Android.Widget; namespace AXMLMonoGUITest { [Activity(Label = "AXMLMonoGUITest", MainLauncher = true, Icon = "@drawable/icon")] public partial class MainActivity : Activity { protected override void OnCreate(Bundle bundle) { base.OnCreate(bundle); this.Initialize(); this.btnTest.Click += new EventHandler(btnTest_Click); } void btnTest_Click(object sender, EventArgs e) { Toast.MakeText(this, etUsername.Text, ToastLength.Long).Show(); } } }

Alles sieht nun sehr übersichtlich und sauber aus. Das GUI Casting ist in einer separaten Klasse und wir können uns über GUI Elemente im Intellisense freuen. Hier neu ein das Beispiel als Screenshot:

Start the conversation