2011-12-16 80 views
2

在我的第一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 )。如何在不實例化活動中的每個實例的情況下處理子類查看事件?

enter image description here

我試圖現在要做的就是處理每個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(); 
}; 

enter image description hereenter image description here

以更進一層,我可以創建在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(); 
} 

回答

3

你就不能掛鉤的事件處理程序在BorderedTextView構造實際的方法是什麼?

+0

謝謝,這工作(我沒有看到樹木的森林,使事情比他們需要更復雜的情況下)。已更新解決方案的問題。 – billmaya 2011-12-16 20:00:05

相關問題