在我的第一MonoDroid的應用程序,我子類的TextView這樣我就可以顯示周圍的每個視圖(Android - Way to appear bordered text on the TextView?)邊框,設法將其添加到我的佈局XML(Declaring a custom android UI element using XML),並獲得各地由於Android的命名空間的MonoDroid的的lowercasing NullReferenceException異常(Avoiding a NullReferenceException when creating a custom Android UI element from subclassed TextView )。如何在不實例化活動中的每個實例的情況下處理子類查看事件?
我試圖現在要做的就是處理每個BorderedTextView觸摸事件。
我知道我可以使用FindViewById獲得每個視圖<>並創建一個委託來處理每個視圖的Click事件。
BorderedTextView currentDate = FindViewById<BorderedTextView>(Resource.Id.currentdate);
currentDate.Click += delegate {
Toast toast = Toast.MakeText(this, "CURRENT DATE tapped", ToastLength.Long);
toast.Show();
}
BorderedTextView startTime = FindViewById<BorderedTextView>(Resource.Id.starttime);
startTime.Click += delegate {
Toast toast = Toast.MakeText(this, "START TIME tapped", ToastLength.Long);
toast.Show();
};
以更進一層,我可以創建在BorderedTextView的常用方法來處理的點擊(但我仍然需要實例化每個BorderedTextView)。
// In Activity's OnCreate
BorderedTextView currentDate = FindViewById<BorderedTextView>(Resource.Id.currentdate);
currentDate.Click += delegate {
BorderedTextView.HandleClicks(this);
}
BorderedTextView startTime = FindViewById<BorderedTextView>(Resource.Id.starttime);
startTime.Click += delegate {
BorderedTextView.HandleClicks(this);
};
// In BorderedTextView
public static void HandleClicks(Context context)
{
Toast toast = Toast.MakeText(context, "BorderedTextView tapped", ToastLength.Long);
toast.Show();
}
由於BorderedTextViews的數量會發生變化,我想以處理click事件,而不必實例在活動的OnCreate每個視圖。我以爲我可以在android:clickable和android:onClick屬性的佈局XML文件中做些什麼。
<mbta.BorderedTextView
android:id="@+id/currentdate"
android:text="CURRENT DATE"
android:textSize="15pt"
android:layout_width="fill_parent"
android:layout_height="75dp"
android:gravity="center_horizontal|center_vertical"
android:layout_weight="1"
android:clickable="true"
android:onClick="HandleClicks"/>
但事實證明MonoDroid的不支持這樣(Mono Droid onClick event not found)註冊事件。
我目前已經嘗試使用SetOnClickListener和視圖的OnTouchEvent事件,但沒有成功(使用Xamarin的API Design頁面上的Events and Listeners部分的信息)。
我想要的是在BorderedTextView類中使用單一方法處理每個BorderedTextView點擊事件的方法,而無需在Activity的OnCreate中實例化每個視圖。這是可能的MonoDroid或我只是試圖做一些工具目前不支持的東西。
在此先感謝。
更新 - 11年12月16日
jpobst的建議掛鉤的事件處理程序BorderedTextView的建設者的工作。
public BorderedTextView(Context context, IAttributeSet attrs, int defStyle) : base(context, attrs, defStyle)
{
this.Click += delegate {
HandleClicks (context);
};
this.Tag = this.Text;
}
public BorderedTextView(Context context, IAttributeSet attrs) : base(context, attrs)
{
this.Click += delegate {
HandleClicks (context);
};
this.Tag = this.Text;
}
public BorderedTextView(Context context) : base(context)
{
this.Click += delegate {
HandleClicks(context);
};
this.Tag = this.Text;
}
而這裏的處理click
public static void HandleClicks(Context context)
{
string typeName = ((Type)this.GetType()).Name;
stirng selected = "Selected " + (string)this.Tag + " (" + typeName + ")";
Toast.MakeText(context, selected, ToastLength.Short).Show();
}
謝謝,這工作(我沒有看到樹木的森林,使事情比他們需要更復雜的情況下)。已更新解決方案的問題。 – billmaya 2011-12-16 20:00:05