Как после удержания кнопки n-ое количество времени и ввода после этого определенной комбинации кнопок вызвать вторую активити?
Я не могу понять как вызвать вторую активити после удержания кнопки "=" 4 секунды, и ввода комбинации "1,2,3" после этого в течение 5 последующих секунд в моём мини-калькуляторе. Проблема сводится к тому можно ли одновременно запустить OnClickListener с методом OnTouch или нет? На данный момент я уже несколько раз пробовал решить эту задачу, но пока не получается. Метод OnTouch почему-то не работает как обработчик события кнопки "=". Она просто не нажимается. Вот то, что у меня есть:

package com.demo.calculator;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.text.InputFilter;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Scriptable;
public class MainActivity extends AppCompatActivity {
/********* Объявление переменных **********/
Button btnClear;
TextView tvProcessor, tvResult;
Button btnOne, btnTwo, btnThree, btnFour, btnFive, btnSix, btnSeven, btnEight,
btnNine, btnZero;
String processor;
Button btnDot, btnDel, btnEqual, btnDivide, btnMultiply, btnMinus, btnPlus;
Button btnLeftScope, btnRightScope;
@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnClear = (Button) findViewById(R.id.btnClear);
tvProcessor = (TextView) findViewById(R.id.tv_process);
tvResult = (TextView) findViewById(R.id.tv_result);
tvProcessor.setText("");
tvResult.setText("");
btnOne = (Button) findViewById(R.id.btnOne);
btnTwo = (Button) findViewById(R.id.btnTwo);
btnThree = (Button) findViewById(R.id.btnThree);
btnFour = (Button) findViewById(R.id.btnFour);
btnFive = (Button) findViewById(R.id.btnFive);
btnSix = (Button) findViewById(R.id.btnSix);
btnSeven = (Button) findViewById(R.id.btnSeven);
btnEight = (Button) findViewById(R.id.btnEight);
btnNine = (Button) findViewById(R.id.btnNine);
btnZero = (Button) findViewById(R.id.btnZero);
btnDot = (Button) findViewById(R.id.btnDot);
btnEqual = (Button) findViewById(R.id.btn_equal);
btnDel = (Button) findViewById(R.id.btnDel);
btnLeftScope = (Button) findViewById(R.id.btnLeftScope);
btnRightScope = (Button) findViewById(R.id.btnRightScope);
btnDivide = (Button) findViewById(R.id.btn_divide);
btnMultiply = (Button) findViewById(R.id.btn_multiply);
btnMinus = (Button) findViewById(R.id.btn_minus);
btnPlus = (Button) findViewById(R.id.btn_plus);
/***************************************************
Обработчики на цифры на калькуляторе
***************************************************/
btnClear.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
tvProcessor.setText("");
tvResult.setText("");
}
});
btnOne.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
processor = tvProcessor.getText().toString();
tvProcessor.setText(processor + "1");
}
});
btnTwo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
processor = tvProcessor.getText().toString();
tvProcessor.setText(processor + "2");
}
});
btnThree.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
processor = tvProcessor.getText().toString();
tvProcessor.setText(processor + "3");
}
});
btnFour.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
processor = tvProcessor.getText().toString();
tvProcessor.setText(processor + "4");
}
});
btnFive.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
processor = tvProcessor.getText().toString();
tvProcessor.setText(processor + "5");
}
});
btnSix.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
processor = tvProcessor.getText().toString();
tvProcessor.setText(processor + "6");
}
});
btnSeven.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
processor = tvProcessor.getText().toString();
tvProcessor.setText(processor + "7");
}
});
btnEight.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
processor = tvProcessor.getText().toString();
tvProcessor.setText(processor + "8");
}
});
btnNine.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
processor = tvProcessor.getText().toString();
tvProcessor.setText(processor + "9");
}
});
btnZero.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
processor = tvProcessor.getText().toString();
tvProcessor.setText(processor + "0");
}
});
/***************************************************
Обработчики на арифметические операции на калькуляторе
***************************************************/
btnMultiply.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
processor = tvProcessor.getText().toString();
tvProcessor.setText(processor + "×");
}
});
btnMinus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
processor = tvProcessor.getText().toString();
tvProcessor.setText(processor + "-");
}
});
btnPlus.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
processor = tvProcessor.getText().toString();
tvProcessor.setText(processor + "+");
}
});
btnDivide.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
processor = tvProcessor.getText().toString();
tvProcessor.setText(processor + "÷");
}
});
/***************************************************
Обработчики на функциональные операции на калькуляторе
***************************************************/
btnDot.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
processor = tvProcessor.getText().toString();
tvProcessor.setText(processor + ".");
}
});
btnDel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
processor = tvProcessor.getText().toString();
if (processor.length() > 0) {
processor = processor.substring(0, processor.length()-1);
tvProcessor.setText(processor);
}
}
});
btnLeftScope.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
processor = tvProcessor.getText().toString();
tvProcessor.setText(processor + "(");
}
});
btnRightScope.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
processor = tvProcessor.getText().toString();
tvProcessor.setText(processor + ")");
}
});
btnEqual.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
processor = tvProcessor.getText().toString();
processor = processor.replaceAll("×", "*");
processor = processor.replaceAll("÷", "/");
Context rhino = Context.enter();
rhino.setOptimizationLevel(-1);
String result = "";
try {
Scriptable scope = rhino.initStandardObjects();
result = rhino.evaluateString(scope, processor, "JavaScript",1, null).toString();
} catch (Exception e) {
result = "Error";
}
tvResult.setText(result);
}
});
/*btnEqual.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
Toast.makeText(getApplicationContext(), "Yes", Toast.LENGTH_SHORT).show();
return false;
}
});*/
btnEqual.setOnTouchListener(new View.OnTouchListener() {
long startTime;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: // нажатие
startTime = System.currentTimeMillis();
break;
case MotionEvent.ACTION_MOVE: // движение
break;
case MotionEvent.ACTION_UP: // отпускание
case MotionEvent.ACTION_CANCEL:
long totalTime = System.currentTimeMillis() - startTime;
long totalSecunds = totalTime / 1000;
if( totalSecunds >= 3 )
{
Toast.makeText(getApplicationContext(), "Yes", Toast.LENGTH_SHORT);
}
break;
}
return true;
}
});
}
}
Ответы (1 шт):
Идея брать currentTimeMillis не совсем правильная, я бы посоветовал через Handler, для этого создаем переменные
//ключ что бы показать что можно вводить секретную комбинацию (ключ)
boolean canEnterKey = false;
// наш Handler
Handler handler;
// наш <таймер> в нем обрабатываем что будет через N время
Runnable timer = new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "Enter Secret KEY", Toast.LENGTH_SHORT).show();
canEnterKey = true;
//после 5 сек <запрещаем> вводить ключ
handler.removeCallbacks(blockEnterKey);
handler.postDelayed(blockEnterKey, 5000);
}
};
// выкл разрешение для ввода ключа
Runnable blockEnterKey = new Runnable() {
@Override
public void run() {
canEnterKey = false;
Toast.makeText(getApplicationContext(), "Time out", Toast.LENGTH_SHORT).show();
}
};
Дальше в onCreate меняем btnEqual.setOnTouchListener
btnEqual.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: // нажатие
//удаляем наш timer (на всякий случай)
handler.removeCallbacks(timer);
//запускаем через 4сек *1000
handler.postDelayed(timer, 4000);
break;
case MotionEvent.ACTION_MOVE: // движение
break;
case MotionEvent.ACTION_UP: // отпускание
case MotionEvent.ACTION_CANCEL:
//удаляем наш timer, на случай если кнопку держали меньше 4сек
handler.removeCallbacks(timer);
break;
}
return v.onTouchEvent(event);
}
});
Объявляем наш Handler
handler = new Handler(Looper.getMainLooper());
Вешаем слушатель на tvProcessor
tvProcessor.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {}
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
//НЕ ТЕСТИРОВАЛ условие
if ((s.toString().equals("1") || s.toString().equals("12")) && canEnterKey) {
canEnterKey = true;
} else if (s.toString().equals("123") && canEnterKey) {
//вызваем вторую активити
canEnterKey = false;
} else {
canEnterKey = false;
}
}
});