2011-12-16 2 views
2

В моем первом приложении 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).Как вы можете обрабатывать события с подклассом, не создавая экземпляр каждого экземпляра в действии?

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 будет меняться, и я хотел бы, чтобы обработать событие нажатия без создания экземпляра каждого вида в 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(); 
} 

ответ

3

Разве вы не можете просто подключить свой обработчик событий в конструкторе BorderedTextView?

+0

Спасибо, это сработало (случай, когда я не видел лес для деревьев, делая вещи более сложными, чем они должны были быть). Обновите вопрос с помощью решения. – billmaya

Смежные вопросы