Таймер не позволяет пользователю редактировать

#java #android #xml #user-interface #timer

#java #Android #xml #пользовательский интерфейс #таймер

Вопрос:

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

xml:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@ id/activity_stopwatch"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.adir.stopwatch.StopwatchActivity"
    android:background="#000000"

    >

    <Button
        android:id="@ id/reset_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClickReset"
        android:text="@string/reset"
android:textColor="#FFFFFF"
        android:layout_below="@ id/stop_button"
        android:layout_alignLeft="@ id/stop_button"
        android:layout_alignStart="@ id/stop_button" />

    <EditText
        android:id="@ id/time_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="17dp"
        android:text=""
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textSize="92sp"
        android:textColor="#FFFFFF"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"

android:inputType="time"
        />
    <Button
        android:id="@ id/start_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClickStart"
android:text="@string/start"
        android:textColor="#FFFFFF"
        android:layout_below="@ id/time_view"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="16dp" />

    <Button
        android:id="@ id/stop_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClickStop"
        android:text="@string/stop"
        android:textColor="#FFFFFF"
        android:layout_alignLeft="@ id/start_button"
        android:layout_alignStart="@ id/start_button"
        android:layout_below="@ id/start_button"></Button>


</RelativeLayout>
  

Java:

 public class StopwatchActivity extends Activity {
    private int seconds=0;
    private boolean running;
private boolean wasRunning;
public String time;
    public int hours=seconds/3600;
    public int minutes=(seconds%3600)/60;
    public int secs=seconds%60;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_stopwatch);
        if(savedInstanceState!=null){
            seconds=savedInstanceState.getInt("seconds");
            running=savedInstanceState.getBoolean("running");
            wasRunning=savedInstanceState.getBoolean("wasRunning");
        }
        runTimer();
    }

    public void onClickStart(View view) {

        running = true;
    }
    protected void onStop(){
        super.onStop();
        wasRunning=running;
        running=false;
    }

    protected void onStart() {
    super.onStart();
        if(wasRunning){
            running=true;
        }
    }

    public void onClickStop(View view) {
        running = false;


    }

    public void onClickReset(View view) {
        running = false;
        seconds = 0;
    }

    private void runTimer() {

        final EditText timeView = (EditText) findViewById(R.id.time_view);
        time=timeView.getText().toString();
        final Handler handler = new Handler();
        handler.post(new Runnable() {
            @Override
            public void run() {

                time = String.format("%d:d:d",hours, minutes, secs);

                timeView.setText(time);
                if (running) {
                    seconds--;
                }
                handler.postDelayed(this, 1000);
            }
        });


    }
public void onSaveInstanceState(Bundle savedInstanceState){
    savedInstanceState.putInt("seconds",seconds);
    savedInstanceState.putBoolean("running",running);
    savedInstanceState.putBoolean("wasRunning",wasRunning);
}

    protected void onPause(){
        super.onPause();
        wasRunning=running;
        running=false;
    }

    protected void onResume(){
        super.onResume();
        if(wasRunning){
            running=true;
        }
    }


}
  

Что мне нужно исправить?

Комментарии:

1. Вы хотите, чтобы таймер был таймером обратного отсчета?

2. @espa_network да. таким образом, пользователь напишет примерно 45 секунд, и начнется обратный отсчет

3. Вы должны использовать CountDownTimer вместо Timer Проверки моего ответа

Ответ №1:

Приведенный ниже код даст вам хорошее представление о том, что делать. Когда вы нажмете на кнопку, она получит текст EditText и поместит его в строку. Затем он преобразуется в int. Затем вы можете поместить новую переменную int time в 1-й параметр вашей CountDownTimer функции, чтобы установить продолжительность таймера.

    Button submit;
   TextView timerText;
   EditText editTextTime;
   CountdownTimer yourTimer;
   String  timeString;
   int time;

  submit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

     timeString = String.valueOf(editTextTime.getText());
     time = Integer.valueOf(timeString);


        }
    });


    yourTimer = new CountDownTimer(time, 1000) {

    @Override
    public void onTick(long millisUntilFinished) {


        int seconds = (int) millisUntilFinished / 1000;
        int minutes = seconds / 60;
        seconds %= 60;
        minutes %= 60;


        if (seconds < 10 amp;amp; seconds >= 1) {
            timerText.setText(""   seconds);
        }
    }

    @Override
    public void onFinish() {

    }
}.start();
  

Комментарии:

1. Вы добавили еще одну кнопку для редактирования? неужели невозможно просто нажать на таймер, и он позволит мне редактировать?