Счетчик кликов Android со встроенным таймером обработчика - PullRequest
0 голосов
/ 27 ноября 2018

Я все еще новичок в программировании приложений для Android и, следовательно, нуждаюсь в небольшой помощи.Извините за очень длинный вопрос!

В настоящее время я пытаюсь запрограммировать приложение, которое подсчитывает количество раз, когда кто-то нажимает кнопку.Счетчик должен сбрасываться каждый день (что-то вроде работы).Но в настоящее время он показывает номер клика за день до первого клика и начинает рассчитывать только на второй. Может кто-нибудь сказать мне, где я ошибся с этим?

Также я хочу, чтобы число кликов отображалось в другом упражнении, где я создал обработчик, который включает таймер на 2 часа(Я положил только десять секунд для целей тестирования).Если кнопка не будет нажата в течение 2 часов, появится AlertDialog, чтобы напомнить пользователю, что нужно нажать кнопку.В настоящее время это работает таким образом, что обработчик отсчитывает таймер, а также показывает диалоговое окно, но только если пользователь не покидает действие.Если действие не открывается, когда таймер завершен, диалоговое окно не отображается.Также обработчик не сбрасывается при повторном нажатии кнопки, но запускает другой таймер. Как заставить таймер сбрасываться и запускаться при каждом нажатии кнопки, а также для отображения диалогового окна, когда действие в данный момент не открыто?

Заранее спасибо, ребята!

Соответствующий код в моей основной деятельности:

Button btnWater;

int counter;
private String day;
String today;

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

    //Abfrage des aktuellen Datums:
    Calendar calendar = Calendar.getInstance();
    today = DateFormat.getDateInstance().format(calendar.getTime());
    Button btnWater = (Button) findViewById(R.id.btnWater);
    btnWater.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (day.equals(today)) {
                counter++;
                if (counter <= 8) {
                    Intent waterIntent = new Intent(getApplicationContext(), WaterActivity.class);
                    startActivity(waterIntent);
                } else {
                    Toast.makeText(getApplicationContext(), "Prima! Sie haben schon über 2 Liter getrunken! Gut gemacht!", Toast.LENGTH_LONG).show();
                    Intent waterIntent = new Intent(getApplicationContext(), WaterActivity.class);
                    startActivity(waterIntent);
                }
            } else {
                counter = 1;
                Intent waterIntent = new Intent(getApplicationContext(), WaterActivity.class);
                startActivity(waterIntent);
                day = today;
            }
        }
    });
}



@Override
protected void onStart() {
    super.onStart();

    SharedPreferences prefs = getSharedPreferences("prefs", MODE_PRIVATE);

    day = prefs.getString("zaehlerTag", "08.11.2018");
    counter = prefs.getInt("zaehler", 0);
}

//Sicherstellen, dass Timer "weiterzählt", wenn App geschlossen wird!
@Override
protected void onStop() {
    super.onStop();
    SharedPreferences prefs = getSharedPreferences("prefs", 0);
    SharedPreferences.Editor editor = prefs.edit();

    editor.putInt("zaehler", counter);
    editor.putString("zaehlerTag", day);
    editor.apply();
}

и в моем WaterActivity (код с обработчиком, где отображается счетчик):

int zaehler;
private Handler handler;
private long timeRemaining = 10000;

TextView tvWasserCount;

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

    //Anlegen der Textelemente:
    TextView tvWasser1 = (TextView) findViewById(R.id.tvWasser1);
    TextView tvWasserCount = (TextView) findViewById(R.id.tvWasserCount);
    TextView tvWasser2 = (TextView) findViewById(R.id.tvWasser2);

    //Anlegen des Handlers als Timer für die Wassererinnerung:
    handler = new Handler();

    final Runnable runnable = new Runnable() {

        @Override
        public void run() {
            Log.d("timer", "klappt");
            timeRemaining = timeRemaining - 1000;
            if (timeRemaining > 0) {
                handler.postDelayed(this, 1000);
            } else if (timeRemaining == 0) {
                Calendar calendar = Calendar.getInstance();
                SimpleDateFormat mdformat = new SimpleDateFormat("HH");
                String strTime = mdformat.format(calendar.getTime());
                int time = Integer.parseInt(strTime);
                if (time >= 6 && time <= 22) {
                    AlertDialog.Builder builder = new AlertDialog.Builder(WaterActivity.this);
                    builder.setMessage("Sie haben schon seit 2 Stunden nichts getrunken! Jetzt wäre ein guter Zeitpunkt!").setCancelable(false).setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            finish();
                        }
                    });
                    AlertDialog aDialog = builder.create();
                    aDialog.show();
                }
            }
        }
    };
    handler.postDelayed(runnable, 1000);

    //SharedPreferences zum Abrufen des aktuellen Zähler-Stands:
    SharedPreferences prefs = getSharedPreferences("prefs", 0);

    zaehler = prefs.getInt("zaehler", 1);
    if (zaehler <= 1) {
        tvWasserCount.setText(zaehler + " Glas");
    } else {
        tvWasserCount.setText(zaehler + " Gläser");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...