В моем первом приложении MonoDroid у меня есть подкласс TextView, поэтому я могу отображать рамку вокруг каждого вида ( Android - способ отображения текста с рамками в TextView? ), мне удалось добавить его в мой макет XML( Объявление пользовательского элемента пользовательского интерфейса Android с использованием XML ) и обход вокруг исключений NullReferenceException из-за нижнего регистра MonoDroid для пространств имен Android ( Исключение NullReferenceException при создании пользовательского элемента пользовательского интерфейса Android из подклассированного 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 действия.Я думал, что смогу что-то сделать в XML-файле макета с атрибутами android: clickable и android: onClick.
<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 не найдено ).
В настоящее время я экспериментировал с SetOnClickListener и событием OnTouchEvent представления без успеха (используя информацию из раздела «События и слушатели» на странице API Design Xamarin *)).
Мне нужен способ обработки каждого события щелчка BorderedTextView с помощью одного метода в классе BorderedTextView без необходимости создания экземпляров каждого представления в OnCreate в Activity.Возможно ли это в MonoDroid или я просто пытаюсь сделать что-то, что инструмент не будет поддерживать в настоящее время.
Заранее спасибо.
Обновление - 12.16.11
* 1040Предложение * 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;
}
А вот фактический метод для обработки клика
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();
}