Я нахожусь на заре своих приключений в области программирования для Android и только что научился общаться между экранами. Итак, следующим шагом для меня является успешное извлечение текста из TextView (установленного диалоговым окном) и использование кнопки «Пуск» для запуска таймера на основе диалогового окна, выбранного пользователем (по умолчанию используется текущее минутное значение часов).

Вот что вы видите на экране.

  1. TextView, отображающий выбор из диалогового окна.
  2. Кнопка выбора, которая запускает Dialog TimePicker Dialog и сбрасывает кнопку Start.
  3. Кнопка Start, которая (должна) читать TextView, отключать себя и начинать CountDownTimer на основе Long, извлеченного из строки TextView.
  4. Отладочный TextView, который показывает мне то, что на самом деле видит система.

Вся деятельность состоит из одного файла Java с двумя объявленными классами и, конечно же, XML. Каждый раз, когда я нажимаю кнопку запуска, несмотря на то, что Debug TextView показывает, что я правильно извлек значение Long за секунды, которые таймер мгновенно завершает. Из моего отладочного TextView я вижу, что когда я выбираю, скажем ... 08:26, pSecondsLeft = 26, как и должно ... но таймер по-прежнему не отсчитывает от 26. Я не вижу своей ошибки.

Вот сначала XML.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="center"
              android:orientation="vertical">
    <TextView android:id="@+id/timeDisplay"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="center_horizontal"
              android:text="Time will appear here after being selected"
              android:textSize="30sp"/>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button android:id="@+id/pickTime"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Change the time"/>

        <Button android:id="@+id/startTimer"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Start the time"
                />

    </LinearLayout>

    <TextView android:id="@+id/timeRemaining"
              android:layout_height="wrap_content"
              android:layout_width="wrap_content"
              android:layout_gravity="center_horizontal"
              android:textSize="30sp"
              android:text="Time Remaining"
              />


</LinearLayout>

И вот моя основная деятельность.

package com.stembo.android.botskooltimepickertutorial;

import java.util.Calendar;
import java.util.StringTokenizer;

import android.app.Activity;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;

public class TimePickerActivity extends Activity {
    /** Private members of the class */
    private TextView displayTime;
    private Button pickTime;
    private Button startTimer;
    private TextView timeRemaining;

    private int pMinutesLeft;
    private int pSecondsLeft;
    /** This integer will uniquely define the
     * dialog to be used for displaying time picker.*/
    static final int TIME_DIALOG_ID = 0;

    /** Callback received when the user "picks" a time in the dialog */
    private TimePickerDialog.OnTimeSetListener mTimeSetListener =
            new TimePickerDialog.OnTimeSetListener() {
                public void onTimeSet(TimePicker view, int minLeft, int secLeft) {
                    pMinutesLeft = minLeft;
                    pSecondsLeft = secLeft;
                    updateDisplay();
                    displayToast();
                }
            };

    /** Updates the time in the TextView */
    private void updateDisplay() {
        displayTime.setText(
                new StringBuilder()
                        .append(pad(pMinutesLeft)).append(":")
                        .append(pad(pSecondsLeft)));
    }

    /** Displays a notification when the time is updated */
    private void displayToast() {
        Toast.makeText(this, new StringBuilder().append("Time choosen is ")
                .append(displayTime.getText()),   Toast.LENGTH_SHORT).show();

    }

    /** Add padding to numbers less than ten */
    private static String pad(int c) {
        if (c >= 10)
            return String.valueOf(c);
        else
            return "0" + String.valueOf(c);
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        /** Capture our View elements */
        displayTime = (TextView) findViewById(R.id.timeDisplay);
        pickTime = (Button) findViewById(R.id.pickTime);
        startTimer = (Button) findViewById(R.id.startTimer);
        timeRemaining = (TextView) findViewById(R.id.timeRemaining);

        /** Listener for click event of the pick button */
        pickTime.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                startTimer.setEnabled(true);
                showDialog(TIME_DIALOG_ID);
            }
        });

        /**Listener for click event of the start button */
        startTimer.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                startTimer.setEnabled(false);
                StringTokenizer st = new StringTokenizer(displayTime.getText().toString(), ":");
                while (st.hasMoreElements()){
                    st.nextElement();
                    long pSecondsTimer = Long.parseLong(st.nextToken());
                }
                timeRemaining.setText(displayTime.getText()+" Token="+ pSecondsLeft);
                long oneSecondInterval = 1000;
                MyCount counter = new MyCount(pSecondsLeft, oneSecondInterval);
                counter.start();
            }
        });

        /** Get the current time */
        final Calendar cal = Calendar.getInstance();
        pMinutesLeft = cal.get(Calendar.HOUR_OF_DAY);
        pSecondsLeft = cal.get(Calendar.MINUTE);

        /** Display the current time in the TextView */
        updateDisplay();
    }

    /** Create a new dialog for time picker */

    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
            case TIME_DIALOG_ID:
                return new TimePickerDialog(this,
                        mTimeSetListener, pMinutesLeft, pSecondsLeft, true);
        }
        return null;
    }

    public class MyCount extends CountDownTimer {
        public MyCount(long pSecondsLeft, long countDownInterval){
            super(pSecondsLeft, countDownInterval);
        }

        @Override
        public void onTick(long pSecondsTimer){
            displayTime.setText("Time remaining: " + pSecondsLeft);
        }

        @Override
        public void onFinish(){
            displayTime.setText("Countdown Complete!");
        }
    }
}

Вот код кнопки «Пуск», с которым у меня возникли проблемы, он находится в основном действии, но его легче исключить.

/**Listener for click event of the start button */
        startTimer.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                startTimer.setEnabled(false);
                StringTokenizer st = new StringTokenizer(displayTime.getText().toString(), ":");
                while (st.hasMoreElements()){
                    st.nextElement();
                    long pSecondsTimer = Long.parseLong(st.nextToken());
                }
                timeRemaining.setText(displayTime.getText()+" Token="+ pSecondsLeft);
                long oneSecondInterval = 1000;
                MyCount counter = new MyCount(pSecondsLeft, oneSecondInterval);
                counter.start();
            }
        });
2
Stembolt 18 Фев 2016 в 23:24

2 ответа

Лучший ответ

Я думаю, это потому, что вы не вычитаете из переменной pSecondsLeft на каждом тике

public class MyCount extends CountDownTimer {
        public MyCount(long pSecondsLeft, long countDownInterval){
            super(pSecondsLeft, countDownInterval);
        }

        @Override
        public void onTick(long pSecondsTimer){
            displayTime.setText("Time remaining: " + pSecondsLeft);
            pSecondsLeft --;           
        }

        @Override
        public void onFinish(){
            displayTime.setText("Countdown Complete!");
        }
    }
0
Phil 18 Фев 2016 в 20:47