Kevin
Kevin

Reputation: 203

View.OnClickListener, can you explain?

Sorry if this question might be stupid for you, but I'm new to Android programming and I can't wrap my head around Java syntax.

Can you explain what is happening with this line of code step by step?

View.OnClickListener ourOnClickListener = new View.OnClickListener() {
       @Override
       public void onClick(View v){
       ourMessage.setText(“The button got tapped”);
       }
   };

Upvotes: 6

Views: 2017

Answers (1)

wasyl
wasyl

Reputation: 3506

There is an interface declared inside View class, and it's OnClickListener, it looks like this in View.java source:

/**
* Interface definition for a callback to be invoked when a view is clicked.
*/
public interface OnClickListener {
    /**
     * Called when a view has been clicked.
     *
     * @param v The view that was clicked.
     */
    void onClick(View v);
}

Normally you would create a class, and have it implement this interface:

public void MyClass implements View.OnClickListener {

  @Override
  public void onClick(View view) {
    // do stuff
  }
}

But sometimes you don't need this class in a separate file. Instead, you can create anonymous inner class, it's like creating new class, which only methods are the one from the interface specified:

new View.OnClickListener() {
       @Override
       public void onClick(View v){
           ourMessage.setText(“The button got tapped”);
       }
}

You can then use instance of this class everywhere the View.OnClickListener interface is needed.

What's also worth mentioning is that anonymous inner class will hold a reference to the class in which you're creating it. So this will be legal and valid:

public class MyClass {

  private int clicksCount = 0;

  private View.OnClickListener listener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      clicksCount += 1;
    }
  }
}

Here you can access clicksCount field, which is field of MyClass even from the inner class that implements OnClickListener. Side note - if you want to access a variable, you need to add final modifier to it:

public void testMethod(final int canAccess, int cantAccess) {
  final String test = otherView.getText().toString();
  myView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      // Cannot access cantAccess, because it's not final
      if (test.length == 0) { // can access
        // do something
      }
    }
}

Upvotes: 14

Related Questions