Если кнопка не будет нажата снова в течение 10 секунд, отправить оповещение

У меня есть кнопка («проверить»), которая запускает обратный отсчет, когда он достигает нуля, телефон вибрирует. Повторное нажатие «проверить» отключает вибрацию, и процесс начинается сначала. Нажатие «оповещение» в любое время отправляет SMS на заранее указанный номер. Пока это мой код, и пока он работает нормально. Но хотелось бы подключить эти функции, чтобы после начала вибрации у пользователя было десять секунд, чтобы тапнуть "проверить" и перезапустить таймер, иначе запустится функция "оповещения", отправка смс. Как бы я это сделал? Нужно ли мне делать еще один таймер обратного отсчета?

Код кнопки "проверить" на данный момент:

check.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                vibe.cancel();
                if (countDownTimer != null)
                    countDownTimer.cancel();

                countDownTimer = new CountDownTimer(timerTime * 1000, 1000) {

                    @Override
                    public void onTick(long milliseconds) {
                        long minutes = milliseconds / 60000;
                        long seconds = (milliseconds / 1000) % 60;
                        minsLeft.setText(getString(R.string.minutes) + (int) (minutes) + "  seconds:" + (int) (seconds));

                    }

                    @Override
                    public void onFinish() {
                        minsLeft.setText("Are You OK?");
                        long[] pattern = {100, 1000, 100, 2};
                        vibe.vibrate(pattern, 1);
                    }
                }.start();
            }
        });
    }

Код кнопки "предупреждение" (это будет вызвано, если "проверить" не будет нажата снова):

    public void onAlertClick(View view) {
        Toast sent = Toast.makeText(getApplicationContext(), "Alert Sent", Toast.LENGTH_SHORT);
        Toast permissions = Toast.makeText(getApplicationContext(), "Please change app permissions in settings", Toast.LENGTH_SHORT);


        try {
            SmsManager.getDefault().sendTextMessage(getString(R.string.smsNumber), null,
                    getString(R.string.smsMessage), null, null);
            sent.show();

        } catch (Exception e) {
            permissions.show();
        }
    }

person Molly Taylor    schedule 01.04.2017    source источник
comment
Пожалуйста, используйте тег android studio только для общих вопросов по программированию - он предназначен для вопросов о самом инструменте.   -  person EJoshuaS - Reinstate Monica    schedule 01.04.2017
comment
Вы показали здесь много кода, и это хорошо, но вы мало что делаете, чтобы объяснить проблему с ним. Есть ли ошибка в logcat? Что-то происходит не так, как вы ожидаете? Что вы ожидали? Вы, вероятно, получите больше (и лучших) ответов, если предоставите здесь более подробную информацию.   -  person HPierce    schedule 01.04.2017
comment
@HPierce (и EJoshuaS) Я внес некоторые изменения в свой вопрос и теги. Я не уверен, что смогу сделать это более конкретным, потому что понятия не имею, с чего даже начать. Однако я внес некоторые изменения, чтобы уточнить мой вопрос. Надеюсь, это поможет.   -  person Molly Taylor    schedule 01.04.2017


Ответы (1)


что бы я сделал, это создать фрагмент диалога, когда первый таймер заканчивается, а затем в этом фрагменте диалога есть еще один таймер, который отсчитывает 10 секунд - если таймер диалога достигает 0, затем выполните свой метод предупреждения:

(ps вы можете вложить этот класс в свой основной класс, чтобы вы могли проще вызывать свой первый таймер обратного отсчета)

public static class SessionExpiringDialog extends DialogFragment {
    CountDownTimer countDownTimer2;
    public SessionExpiringDialog() {
        super();
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater inflater = getActivity().getLayoutInflater();
        final View view = inflater.inflate(R.layout.session_dialog, null);
        final TextView sessionText = (TextView) view.findViewById(R.id.session_text);
        countDownTimer2 = new CountDownTimer2(11000, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                long diffSeconds = millisUntilFinished / 1000 % 60;
                sessionText.setText("SMS Alert will be sent in: " + diffSeconds + " seconds.");
            }

            @Override
            public void onFinish() {
                onAlertClick(view);
            }
        };
        countDownTimer2.start();
        builder.setView(view);
        builder.setMessage("Alert SMS Pending").setTitle("ATTENTION:")
                .setPositiveButton("I'm OKAY!", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        countDownTimer2.cancel();
                        countDownTimer.start();
                        dismiss();
                    }
                });
        return builder.create();
    }
}

этот код предполагает, что существует макет xml с именем res/layout/session_dialog.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/session_text"
    android:textSize="20sp"
    android:textStyle="bold"
    android:layout_gravity="center"

    />

</LinearLayout>

затем, чтобы вызвать этот код, поместите его в метод onFinish() вашего первого таймера обратного отсчета:

check.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            vibe.cancel();
            if (countDownTimer != null)
                countDownTimer.cancel();

            countDownTimer = new CountDownTimer(timerTime * 1000, 1000) {

                @Override
                public void onTick(long milliseconds) {
                    long minutes = milliseconds / 60000;
                    long seconds = (milliseconds / 1000) % 60;
                    minsLeft.setText(getString(R.string.minutes) + (int) (minutes) + "  seconds:" + (int) (seconds));

                }

                @Override
                public void onFinish() {
                    minsLeft.setText("Are You OK?");
                    long[] pattern = {100, 1000, 100, 2};
                    vibe.vibrate(pattern, 1);
                    SessionExpiringDialog sessionExpiringDialog = new SessionExpiringDialog();
                    sessionExpiringDialog.setCancelable(false);
                    sessionExpiringDialog.show(getSupportFragmentManager(), "tag");
                }
            }.start();
        }
    });
}

наконец, я не понял, почему вы передаете представление в свой метод onAlertClick(), но я пошел дальше и включил его в свой вставленный код.

person buradd    schedule 01.04.2017