Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating a custom OnClickListener

I have an ArrayList of Buttons where my OCL needs to know which index I has been pressed. The plan is something like this:

MyOnClickListener onClickListener = new MyOnClickListener() {

        @Override
        public void onClick(View v) {

            Intent returnIntent = new Intent();
            returnIntent.putExtra("deleteAtIndex",idx);
            setResult(RESULT_OK, returnIntent);
            finish();

        }
    };
    for (int i =0;i<buttonList.size();i++) {
        buttonList.get(i).setText("Remove");
        buttonList.get(i).setOnClickListener(onClickListener);
    }

How does my implementation of the OCL need to look like ?

Currently I have this:

public class MyOnClickListener implements OnClickListener{

int index;

public MyOnClickListener(int index)
{
    this.index = index;
}

@Override
public void onClick(View arg0) {


}

}

However, I am unsure of what I need to do within the constructor of my OCL, aswell as the overriden onClick function.

like image 741
Adrian Jandl Avatar asked Mar 05 '13 11:03

Adrian Jandl


People also ask

What is the difference between onClick and OnClickListener?

View. OnClickListener is an interface, which defines the onClick(View) method. If you have a class which intends to listen for clicks, you should both implement the interface (if not already extending a class that does), and implement this method too. You have to use both; they're not somehow alternatives.

What is the purpose of using OnClickListener?

In Android, the OnClickListener() interface has an onClick(View v) method that is called when the view (component) is clicked. The code for a component's functionality is written inside this method, and the listener is set using the setOnClickListener() method.

What is setOnClickListener in Kotlin?

Kotlin setOnClickListener for Button Android Button widget is a UI element generally used to receive user actions as input. You can click on a Button, long press, etc. In this tutorial, we shall learn to set OnClickListener for Button.


1 Answers

I'm not sure this applies specifically to your case, but I had the desire to create a custom listener for clickable elements to prevent them being clicked twice (if the user taps quickly).

My solution was to create a listener class that I pass a custom Runnable to and then handle that Runnable if the button is being clicked the first time, but obviously you can pass any custom behavior in, this is just one very simple illustration of how to use it...

import android.content.Context;
import android.os.Handler;
import android.util.Log;
import android.view.View;



public class MyCustomOnClickListener implements View.OnClickListener {
    public static final String TAG = MyCustomOnClickListener.class.getSimpleName();
    private Runnable doOnClick;
    private Context mContext;
    private int isClicked = 0;
    public MyCustomOnClickListener(Context c, Runnable doOnClick) throws Exception{
        if(!(c instanceof Context) || !(doOnClick instanceof Runnable))
            throw new Exception("MyCustomOnClickListener needs to be invoked with Context and Runnable params");
        this.doOnClick = doOnClick;
        this.mContext = c;
    }

    @Override
    public void onClick(View view) {
        Log.v(TAG,"onClick() - detected");
        if(isClicked++ > 0)return; //this prevents multiple clicks
        Log.d(TAG, String.format("onClick() - being processed. View.Tag = \"%s\"", view.getTag().toString()));
        new Handler(mContext.getMainLooper()).post(doOnClick);
    }
}

and then to use it (assuming you're in an Activity for the this context)...

try{
   Button aButton = findViewById(R.id.someButton);
   aButton.setOnClickListener(new MyCustomOnClickListener(/*context*/this, new Runnable(){
  public void run(){
    //here you would put whatever you would have otherwise put in the onClick handler. If you need the View that's being clicked you can replace the Runnable with a custom Runnable that passes the view along 
  }
}));
}catch(...){

}
like image 183
Yevgeny Simkin Avatar answered Sep 29 '22 14:09

Yevgeny Simkin