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