Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Xamarin.Android: How to capture Button events defined in the OnClick XML attribute?

I have this Button inside a RelativeLayout which is included as part of a custom ListView row Layout.

<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" />

When the user clicks the Button, I want the Button to call this function:

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

However, I am getting this error

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'

I am trying to differentiate between the different buttons I have in that ListView. Also, each row has multiple Buttons.

Edit:

Don't use tags in Buttons it can cause performance drop during ListView scrolling. The solution below is a better option.

like image 561
IMHeadHunter Avatar asked Nov 25 '13 16:11

IMHeadHunter


1 Answers

Add the attribute [Java.Interop.Export] to your click handler method:

[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);
}

This will expose the method to Java via the Generated Callable Wrapper for your activity so it can invoked from the Java runtime.

See:

  1. Mono For Android 4.2 release notes within the section titled "Exporting arbitrary Java member for better Java integration".

Important Note

Using [Java.Interop.Export] requires you to add the Mono.Android.Export assembly to your project.

Therefore this feature is only available for Indie and higher licences.

like image 83
matthewrdev Avatar answered Sep 24 '22 15:09

matthewrdev