Xamarin.Android: как захватывать события Button, определенные в атрибуте XML OnClick?

У меня есть эта кнопка внутри RelativeLayout, которая включена как часть настраиваемого макета строки ListView.

<Button p1:text="Edit" p1:layout_width="75dp" p1:layout_height="wrap_content" p1:id="@+id/editButton" p1:layout_centerHorizontal="true" p1:background="@drawable/btn_blue" p1:textColor="@color/white" p1:focusable="false" p1:layout_below="@id/sparyTableLayout" p1:textAppearance="?android:attr/textAppearanceMedium" p1:onClick="myClickHandler" /> 

Когда пользователь нажимает кнопку, я хочу, чтобы кнопка вызывала эту функцию:

 public void myClickHandler(View v) { Console.WriteLine ((v as Button).Text); } 

Однако, я получаю эту ошибку

 java.lang.IllegalStateException: Could not find a method myClickHandler(View) in the activity class Test_Project.MyActivity for onClick handler on view class android.widget.Button with id 'editButton' 

Я пытаюсь различать различные кнопки, которые у меня есть в этом ListView. Кроме того, каждая строка имеет несколько кнопок.

Редактировать:

Не используйте теги в кнопках, это может привести к снижению производительности во время прокрутки ListView. Решение ниже – лучший вариант.

Solutions Collecting From Web of "Xamarin.Android: как захватывать события Button, определенные в атрибуте XML OnClick?"

Добавьте атрибут [Java.Interop.Export] к вашему методу обработчика кликов:

 [Java.Interop.Export("myClickHandler")] // The value found in android:onClick attribute. public void myClickHandler(View v) // Does not need to match value in above attribute. { Console.WriteLine ((v as Button).Text); } 

Это вызовет метод Java через Generated Callable Wrapper для вашей активности, чтобы он мог вызываться из среды выполнения Java.

Видеть:

  1. Mono Для выпусков версии 4.2 Android в разделе «Экспорт произвольного Java-члена для лучшей интеграции Java».

Важная заметка

Используя [Java.Interop.Export] вы должны добавить сборку Mono.Android.Export в свой проект.

Поэтому эта функция доступна только для инди и более высоких лицензий.