В моем первом приложении MonoDroid я подклассифицировал TextView, чтобы я мог отображать рамку вокруг каждого вида (Android - Way to appear bordered text on the TextView?), удалось добавить его в мой макет XML (Declaring a custom android UI element using XML) и обойти NullReferenceExceptions из-за нижнего индекса MonoDroid пространств имен Android (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 будет меняться, и я хотел бы, чтобы обработать событие нажатия без создания экземпляра каждого вида в 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 event not found).
В настоящее время я экспериментировал с SetOnClickListener и событием OnTouchEvent представления без успеха (используя информацию из раздела «События и слушатели» на странице API Design Xamarin).
Я хочу, чтобы обработать каждое событие кликов BorderedTextView с помощью одного метода в классе BorderedTextView без необходимости создавать экземпляр каждого представления в OnCreate Activity. Возможно ли это в MonoDroid или я просто пытаюсь сделать то, что инструмент не будет поддерживать в это время.
Заранее спасибо.
Update - Предложение 12.16.11
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();
}
Спасибо, это сработало (случай, когда я не видел лес для деревьев, делая вещи более сложными, чем они должны были быть). Обновите вопрос с помощью решения. – billmaya