android – How to make a function execute while I have a button pressed?

Question:

I have a project which I want when pressing a button an integer variable is increased or decreased, and it is shown in a Text Edit, I already have that part but it only does it when I press the button, The next step that I want to implement is that when you leave the button pressed, the addition or subtraction function is repeated every X time and that when you release the button, the function stops repeating.

I investigated the onlongclicklistener method but I only get it to execute once. I tried to use a handler but I don't know how to stop the process afterwards, and I don't know if it's the best way to do it.

public class MainActivity extends AppCompatActivity implements View.OnClickListener,View.OnLongClickListener {

    private String GradosMotor_StringM1 = "179";
    private String GradosMotor_StringM2 = "80";
    private String GradosMotor_StringM3 = "50";
    private String GradosMotor_StringM4 = "0";
    private String GradosMotor_StringM5 = "180";
    private String GradosMotor_StringM6 = "80";

    private int GradosMotor_intM1 = 179;
    private int GradosMotor_intM2 = 80;
    private int GradosMotor_intM3 = 50;
    private int GradosMotor_intM4 = 0;
    private int GradosMotor_intM5 = 180;
    private int GradosMotor_intM6 = 90;


    private EditText editText_M1;
    private EditText editText_M2;
    private EditText editText_M3;
    private EditText editText_M4;
    private EditText editText_M5;
    private EditText editText_M6;

    private Button button_less_M1;
    private Button button_less_M2;
    private Button button_less_M3;
    private Button button_less_M4;
    private Button button_less_M5;
    private Button button_less_M6;

    private Button button_plus_M1;
    private Button button_plus_M2;
    private Button button_plus_M3;
    private Button button_plus_M4;
    private Button button_plus_M5;
    private Button button_plus_M6;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


    button_less_M1.setOnTouchListener(this);
    button_less_M2.setOnTouchListener(this);
    button_less_M3.setOnTouchListener(this);
    button_less_M4.setOnTouchListener(this);
    button_less_M5.setOnTouchListener(this);
    button_less_M6.setOnTouchListener(this);

    button_plus_M1.setOnTouchListener(this);
    button_plus_M2.setOnTouchListener(this);
    button_plus_M3.setOnTouchListener(this);
    button_plus_M4.setOnTouchListener(this);
    button_plus_M5.setOnTouchListener(this);
    button_plus_M6.setOnTouchListener(this);



    button_plus_M1.setOnLongClickListener(this);
    button_plus_M2.setOnLongClickListener(this);
    button_plus_M3.setOnLongClickListener(this);
    button_plus_M4.setOnLongClickListener(this);
    button_plus_M5.setOnLongClickListener(this);
    button_plus_M6.setOnLongClickListener(this);

    button_less_M1.setOnLongClickListener(this);
    button_less_M2.setOnLongClickListener(this);
    button_less_M3.setOnLongClickListener(this);
    button_less_M4.setOnLongClickListener(this);
    button_less_M5.setOnLongClickListener(this);
    button_less_M6.setOnLongClickListener(this);
    button_less_M1.setOnLongClickListener(this);


    }//Cierre Funcion onCreate


    //metodos Para sumar o restar grados

    @Override
    public void onClick(View v) {
        switch(v.getId()){

            case R.id.button1m:
                //Toast.makeText(MainActivity.this, "-1", Toast.LENGTH_SHORT).show();
                GradosMotor_intM1=restaGrados(editText_M1,GradosMotor_StringM1,GradosMotor_intM1);
                break;
            case R.id.button2m:
                //Toast.makeText(MainActivity.this, "-1", Toast.LENGTH_SHORT).show();
                GradosMotor_intM2=restaGrados(editText_M2,GradosMotor_StringM2,GradosMotor_intM2);
                break;
            case R.id.button3m:
                //Toast.makeText(MainActivity.this, "-1", Toast.LENGTH_SHORT).show();
                GradosMotor_intM3=restaGrados(editText_M3,GradosMotor_StringM3,GradosMotor_intM3);
                break;
            case R.id.button4m:
                //Toast.makeText(MainActivity.this, "-1", Toast.LENGTH_SHORT).show();
                GradosMotor_intM4=restaGrados(editText_M4,GradosMotor_StringM4,GradosMotor_intM4);
                break;
            case R.id.button5m:
                //Toast.makeText(MainActivity.this, "-1", Toast.LENGTH_SHORT).show();
                GradosMotor_intM5=restaGrados(editText_M5,GradosMotor_StringM5,GradosMotor_intM5);
                break;
            case R.id.button6m:
                //Toast.makeText(MainActivity.this, "-1", Toast.LENGTH_SHORT).show();
                GradosMotor_intM6=restaGrados(editText_M6,GradosMotor_StringM6,GradosMotor_intM6);
                break;
            case R.id.button1p:
                // Toast.makeText(MainActivity.this, "+1", Toast.LENGTH_SHORT).show();
                GradosMotor_intM1=sumaGrados(editText_M1,GradosMotor_StringM1,GradosMotor_intM1);
                break;
            case R.id.button2p:
                //Toast.makeText(MainActivity.this, "+1", Toast.LENGTH_SHORT).show();
                GradosMotor_intM2=sumaGrados(editText_M2,GradosMotor_StringM2,GradosMotor_intM2);
                break;
            case R.id.button3p:
                //Toast.makeText(MainActivity.this, "+1", Toast.LENGTH_SHORT).show();
                GradosMotor_intM3=sumaGrados(editText_M3,GradosMotor_StringM3,GradosMotor_intM3);
                break;
            case R.id.button4p:
                //Toast.makeText(MainActivity.this, "+1", Toast.LENGTH_SHORT).show();
                GradosMotor_intM4=sumaGrados(editText_M4,GradosMotor_StringM4,GradosMotor_intM4);
                break;
            case R.id.button5p:
                //Toast.makeText(MainActivity.this, "+1", Toast.LENGTH_SHORT).show();
                GradosMotor_intM5=sumaGrados(editText_M5,GradosMotor_StringM5,GradosMotor_intM5);
                break;
            case R.id.button6p:
                //Toast.makeText(MainActivity.this, "+1", Toast.LENGTH_SHORT).show();
                GradosMotor_intM6=sumaGrados(editText_M6,GradosMotor_StringM6,GradosMotor_intM6);
                break;
        }
    }//Cierre Funcion onClick


    public int sumaGrados (EditText editText_M, String GradosMotor_StringM ,int GradosMotor_intM){
        String GradosMotor_String;
        int GradosMotor_int;

        GradosMotor_int = GradosMotor_intM;
        GradosMotor_String = GradosMotor_StringM;

        comprobarTextEdit(editText_M,GradosMotor_StringM ,GradosMotor_intM);

        GradosMotor_String = editText_M.getText().toString();
        GradosMotor_int =Integer.parseInt(GradosMotor_String);
        if(GradosMotor_int > 180){
            Toast.makeText(this,"Ingresa un valor entre 0 - 180",Toast.LENGTH_SHORT).show();
            GradosMotor_String = String.valueOf(GradosMotor_intM);
            editText_M.setText(GradosMotor_String);

        }else if (GradosMotor_int < 180){
            GradosMotor_int ++;
            GradosMotor_intM =GradosMotor_int;
            GradosMotor_String = String.valueOf(GradosMotor_int);
            editText_M.setText(GradosMotor_String);
        }

        return GradosMotor_intM;
    }


    public int restaGrados (EditText editText_M, String GradosMotor_StringM ,int GradosMotor_intM ){
        String GradosMotor_String;
        int GradosMotor_int;


        GradosMotor_int = GradosMotor_intM;
        GradosMotor_String = GradosMotor_StringM;

        comprobarTextEdit(editText_M,GradosMotor_StringM ,GradosMotor_intM);


        GradosMotor_String = editText_M.getText().toString();
        GradosMotor_int =Integer.parseInt(GradosMotor_String);
        if(GradosMotor_int < 0 || GradosMotor_int > 180){
            Toast.makeText(this,"Ingresa un valor entre 0 - 180",Toast.LENGTH_SHORT).show();
            GradosMotor_String = String.valueOf(GradosMotor_intM);
            editText_M.setText(GradosMotor_String);
        }else if(GradosMotor_int > 0){
            GradosMotor_int --;
            GradosMotor_intM =GradosMotor_int;
            GradosMotor_String = String.valueOf(GradosMotor_int);
            editText_M.setText(GradosMotor_String);
        }

        return GradosMotor_intM;
    }

    public void comprobarTextEdit(EditText editText_M, String GradosMotor_StringM , int GradosMotor_intM){
        String GradosMotor_String;
        if(editText_M.getText().toString().isEmpty()){
            if(GradosMotor_intM == Integer.parseInt(GradosMotor_StringM)) {
                editText_M.setText(GradosMotor_StringM);
            }else{
                GradosMotor_String = String.valueOf(GradosMotor_intM);
                editText_M.setText(GradosMotor_String);
            }
        }
    }

    @Override
    public boolean onLongClick(View v) {
        switch(v.getId()) {

            case R.id.button1m:
                restaGradosRepetible();
                break;
        }
        return true;
    }

    private void restaGradosRepetible() {
        final Handler handler= new Handler();

        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                GradosMotor_intM1 = restaGrados(editText_M1, GradosMotor_StringM1, GradosMotor_intM1);//llamamos nuestro metodo
                handler.postDelayed(this,500);//se ejecutara cada 10 segundos
            }
        },2000);//empezara a ejecutarse después de 5 milisegundos
    }

}//Cierre Main Activity

Answer:

I would recommend you read this post in English Link where they explain it in English

I will still translate the person's response in English

Create a handler in your activity or fragment

private Handler repeatUpdateHandler = new Handler();

Create two variables to know what state is using increase or decrease the amount

private boolean mAutoIncrement = false; //Incrementar
private boolean mAutoDecrement = false; //Reducir

Create an integer to determine the number that will change

public int mValue;

Create a class in your activity where the logic of increasing or decreasing will run

class RptUpdater implements Runnable {
   public void run() {
       if( mAutoIncrement ){
           increment();
           repeatUpdateHandler.postDelayed( new RptUpdater(), REP_DELAY );
       } else if( mAutoDecrement ){
           decrement();
           repeatUpdateHandler.postDelayed( new RptUpdater(), REP_DELAY );
       }
   }
}

Create the onLongPressListener function for your zoom button (Create an equal one for the zoom button)

mBTIncrement.setOnLongClickListener( 
        new View.OnLongClickListener(){
            public boolean onLongClick(View arg0) {
                mAutoIncrement = true;
                repeatUpdateHandler.post( new RptUpdater() );
                return false;
            }
        }
);   

mBTIncrement.setOnTouchListener( new View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        if( (event.getAction()==MotionEvent.ACTION_UP || event.getAction()==MotionEvent.ACTION_CANCEL) 
                && mAutoIncrement ){
            mAutoIncrement = false;
        }
        return false;
    }
});

Finally create your functions to increase and reduce

//para reducir
public void decrement(){
   mValue--;
   _value.setText( ""+mValue );
}
//para Aumentar
public void Aumentar(){
   mValue++;
   _value.setText( ""+mValue );
}
Scroll to Top