Как создать таймер, ожидающий действия пользователя по нажатию кнопки в течение 3 секунд, иначе намерен выполнить другое действие? - PullRequest
0 голосов
/ 13 апреля 2019

Как создать Java-код для Android, который ждет некоторое время, например, 3 - 5 секунд, чтобы пользователь нажал кнопку, которая просто меняет свои координаты xy и увеличивает счет, иначе намерен перейти к другому действию.

Я пытался реализовать это, обращаясь к этому SO-ответу [ Как приостановить / перевести нить в поток или обработать в Android? , но код продолжает выполнять другие действия после 5-6 нажатий кнопок, даже если Я нажимаю в течение указанного времени задержки. Это код -

btn.setOnClickListener(new View.OnClickListener() 
{
        @Override
        public void onClick(View v) 
{
           score++;
            scr=String.valueOf(score);
            scoredisp.setText(scr);
           int xval=xvalue();
            int yval=yvalue();
            btn.setX(xval);
            btn.setY(yval);
            Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() 
{
                    Intent result = new  Intent(MainActivity.this,com.example.warlock.buttonsquash.result.class);
                    startActivity(result);
                }
            }, 3000);

        }
    });


int xvalue() {
    Random randomGenerator = new Random();
    int xval = randomGenerator.nextInt(850) + 1;
    return xval;
}

int yvalue() {
    Random randomGenerator = new Random();
    int yval = randomGenerator.nextInt(1500) + 1;
    return yval;
}

Мне просто нужно нажать кнопку, чтобы изменить координаты кнопки и увеличить значение оценки, но намерение начинает происходить после 5-6 нажатий кнопки.

Ответы [ 4 ]

0 голосов
/ 13 апреля 2019

Я нашел обходной путь сам. Из вопроса вы могли бы понять, что первоначальная проблема заключалась в том, что задержки из-за нескольких обработчиков приводили к нескольким намерениям после 5-6 последовательных нажатий кнопок. Я сослался на этот SO-ответ [ Как изменить / сбросить обработчик после задержки? ] и кодировал stop () и restart () fn, и это исправило мою ошибку.

Прикрепление окончательного кода для справки-

public class MainActivity extends AppCompatActivity {

Button btn; int score; String scr; TextView scoredisp; boolean click;
public static Handler myHandler = new Handler();
private static final int TIME_TO_WAIT = 700;
Runnable myRunnable;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btn=(Button) findViewById(R.id.imgbtn);
    scoredisp=(TextView)findViewById(R.id.score);
    click=false;


    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            stop();
            score++;
            scr=String.valueOf(score);
            scoredisp.setText(scr);

            Random random = new Random();
           int color = Color.argb(255, random.nextInt(256), random.nextInt(256), random.nextInt(256));
           btn.setBackgroundColor(color);

           int xval=xvalue();
            int yval=yvalue();
            //int butang=butangle();
           // btn.setRotation(butang);
            btn.setX(xval);
            btn.setY(yval);
            click=false;
            checkvalue();
            restart();
        }

    });



}

 int xvalue() {
    Random randomGenerator = new Random();
    int xval = randomGenerator.nextInt(850) + 1;
    return xval;
}

int yvalue() {
    Random randomGenerator = new Random();
    int yval = randomGenerator.nextInt(1500) + 1;
    return yval;
}

int butangle() {
    Random randomGenerator = new Random();
    int butang = randomGenerator.nextInt(360) + 1;
    return butang;
}


public void checkvalue() {
    myRunnable = new Runnable() {
        @Override
        public void run() {
            if(!click) {
                Intent result = new Intent(MainActivity.this, com.example.warlock.buttonsquash.result.class);
                startActivity(result);
            }
        }
    };

}

public void start() {
    myHandler.postDelayed(myRunnable, TIME_TO_WAIT);
}

public void stop() {
    myHandler.removeCallbacks(myRunnable);
}

public void restart() {
    myHandler.removeCallbacks(myRunnable);
    myHandler.postDelayed(myRunnable, TIME_TO_WAIT);
}
}

Спасибо всем за ваш ответ.

0 голосов
/ 13 апреля 2019

Этот код позволит пользователю ждать в текущей активности в течение 5 секунд. Пользователь может нажать кнопку в это время, после чего пользователь будет выполнять другие действия.

Используйте этот код внутри onCreate ()

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    //Do something after 5sec.
   // Intent to other activity from there.
  }
}, 5000);

Надеюсь, это поможет вам.

0 голосов
/ 13 апреля 2019

Пожалуйста, попробуйте что-то вроде этого:

        findViewById(R.id.theButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                theButtonWasClicked = true;
            }
        });

        final int FIVE_SECONDS = 5000;

        final Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                if (theButtonWasClicked) {
                    Log.d("TheTag", "5 seconds passed with button clicked!");
                    theButtonWasClicked = false;
                } else {
                    Log.d("TheTag", "5 seconds passed with NO button click!");
                    timer.cancel();
                }
            }
        }, FIVE_SECONDS, FIVE_SECONDS);

Он выполнит желаемое действие, если пользователь не щелкнул в течение 5 секунд, или продолжит ждать до следующих 5 секунд без щелчка (эточто хочешь?)

0 голосов
/ 13 апреля 2019

Сначала сделайте таймер (обработчик) на 3 или 5 секунд.Когда они проходят проверку, верно ли значение boolean for clicked, иначе перенаправить на другое действие.Надеюсь, я тебе помог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...