emitrax emitrax - 5 months ago 62
Android Question

How exactly does the android:onClick XML attribute differ from setOnClickListener?

From that I've read you can assign a

onClick
handler to a button in two ways.

Using the
android:onClick
XML attribute where you just use the name of a public method with the signature
void name(View v)
or by using the
setOnClickListener
method where you pass an object that implement the
OnClickListener
interface. The latter often requires an anonymous class which personally I don't like (personal taste) or defining an internal class that implements the
OnClickListener
.

By using the XML attribute you just need to define a method instead of a class so I was
wondering if the same can be done via code and not in the XML layout.

Answer

No that is not possible via code. Android just implements the OnClickListener for you when you define the android:onClick="someMethod" attribute.

Those two code snippets are totally the same but just implemented in two different ways.

Code Implementation

Button btn = (Button) findViewById(R.id.mybutton);

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        myFancyMethod(v);
    }
});

// some more code

public void myFancyMethod(View v) {
    // does something very interesting
}

Above is a code implementation of an OnClickListener. And now the XML implementation.

XML Implementation

<?xml version="1.0" encoding="utf-8"?>
<!-- layout elements -->
<Button android:id="@+id/mybutton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Click me!"
    android:onClick="myFancyMethod" />
<!-- even more layout elements -->

Now in the background Android does nothing else than the Java code calling your method on a click event.

Note that with the XML above, Android will look for the onClick method myFancyMethod() only in the current Activity. This is important to remember if you are using fragments, since even if you add the XML above using a fragment, Android will not look for the onClick method in the .java file of the fragment used to add the XML.

Another important thing I noticed. You mentioned you don't prefer anonymous methods. You meant to say you don't like anonymous classes.