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

У меня есть эта кнопка внутри 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. Кроме того, каждая строка имеет несколько кнопок.

Edit:

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

Ответ 1

Добавьте атрибут [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.

См:

Важное примечание

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

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