2015-06-14 3 views
2

Итак, 2 дня назад я начал изучать технологии Android. Я написал очень простую программу, которая может подсчитывать время, используя класс CountDownTimer. Вот мой XML-код:Очень простая остановка

<RelativeLayout 

xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="#000000" 
tools:context=".MainActivity" 
android:id="@+id/raf"> 

<Button 
    android:id="@+id/btnStart" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_centerVertical="true" 
    android:layout_marginLeft="28dp" 
    android:textColor="#76EE00" 
    android:background="#2C3529" 
    android:text="Start" /> 

<Button 
    android:id="@+id/btnStop" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_centerVertical="true" 
    android:layout_marginRight="28dp" 
    android:textColor="#76EE00" 
    android:background="#2C3529" 
    android:text="Stop" /> 


<TextView 
    android:id="@+id/textViewHours" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_centerVertical="true" 
    android:layout_marginLeft="100dp" 
    android:layout_marginTop="25dp" 
    android:layout_below="@+id/btnStart" 
    android:layout_centerHorizontal="true" 
    android:layout_marginBottom="20dp" 
    android:textColor="#76EE00" 
    android:textSize="25sp" 
    android:text="Godziny:" 
    /> 

<TextView 
    android:id="@+id/textViewMinutes" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_centerVertical="true" 
    android:layout_marginLeft="100dp" 
    android:layout_below="@+id/textViewHours" 
    android:layout_centerHorizontal="true" 
    android:layout_marginBottom="20dp" 
    android:textColor="#76EE00" 
    android:textSize="25sp" 
    android:text="Minuty:" 
    /> 

<TextView 
    android:id="@+id/textViewSeconds" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="5dp" 
    android:layout_alignParentLeft="true" 
    android:layout_centerVertical="true" 
    android:layout_marginLeft="100dp" 
    android:layout_below="@+id/textViewMinutes" 
    android:layout_centerHorizontal="true" 
    android:layout_marginBottom="20dp" 
    android:textColor="#76EE00" 
    android:textSize="25sp" 
    android:text="Sekundy:" 
    /> 

<TextView 
    android:id="@+id/textViewTime" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/btnStop" 
    android:layout_centerHorizontal="true" 
    android:layout_marginBottom="17dp" 
    android:textColor="#76EE00" 
    android:textSize="25sp" 
    /> 

<EditText 
    android:id="@+id/editHours" 
    android:numeric="integer" 
    android:layout_width="50dp" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/btnStop" 
    android:layout_centerHorizontal="true" 
    android:layout_alignParentLeft="true" 
    android:layout_marginLeft="220dp" 
    android:layout_marginTop="35dp" 
    android:text="1" 
    android:background="#2C3529" 
    android:textColor="#76EE00" 
    /> 

<EditText 
    android:id="@+id/editMinutes" 
    android:numeric="integer" 
    android:layout_width="50dp" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/editHours" 
    android:layout_centerHorizontal="true" 
    android:layout_alignParentLeft="true" 
    android:layout_marginLeft="220dp" 
    android:layout_marginTop="30dp" 
    android:text="0" 
    android:background="#2C3529" 
    android:textColor="#76EE00" 
    /> 

<EditText 
    android:id="@+id/editSeconds" 
    android:numeric="integer" 
    android:layout_width="50dp" 
    android:layout_height="wrap_content" 
    android:layout_below="@+id/editMinutes" 
    android:layout_centerHorizontal="true" 
    android:layout_alignParentLeft="true" 
    android:layout_marginLeft="220dp" 
    android:layout_marginTop="30dp" 
    android:text="0" 
    android:background="#2C3529" 
    android:textColor="#76EE00" 
    /> 

И здесь у нас есть код Java:

package com.example.rafa.minutnik; 

import android.annotation.SuppressLint; 
import android.annotation.TargetApi; 
import android.content.DialogInterface; 
import android.os.Build; 
import android.os.CountDownTimer; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

import java.util.concurrent.TimeUnit; 

@TargetApi(Build.VERSION_CODES.KITKAT) 
@SuppressLint("NewApi") 

public class MainActivity extends ActionBarActivity { 

    private Button btnStart,btnStop; 
    private TextView textViewTime; 
    private EditText editHours, editMinutes, editSeconds; 
    private int Time; 

    public void reset(){ 
     editHours.setText(""); 
     editMinutes.setText(""); 
     editSeconds.setText(""); 
     textViewTime.setText(""); 
    } 

    @Override 
    public View findViewById(int id) { 
     return super.findViewById(id); 
    } 

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

     btnStart = (Button) findViewById(R.id.btnStart); 
     btnStop = (Button) findViewById(R.id.btnStop); 
     textViewTime = (TextView) findViewById(R.id.textViewTime); 
     editHours = (EditText) findViewById(R.id.editHours); 
     editMinutes = (EditText) findViewById(R.id.editMinutes); 
     editSeconds = (EditText) findViewById(R.id.editSeconds); 

     Time = 3600*Integer.parseInt(editHours.getText().toString()) + 
       60*Integer.parseInt(editMinutes.getText().toString()) + 
       Integer.parseInt(editSeconds.getText().toString()); 

     final CounterClass timer = new CounterClass(1000*Time,1000); 

     btnStart.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       timer.start(); 
      } 
     }); 

     btnStop.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       timer.cancel(); 
       reset(); 
      } 
     }); 
    } 

    @TargetApi(Build.VERSION_CODES.KITKAT) 
    @SuppressLint("NewApi") 
    public class CounterClass extends CountDownTimer{ 

     public CounterClass(long milisInFuture, long countDownInterval){ 

      super(milisInFuture,countDownInterval); 
     } 

     @TargetApi(Build.VERSION_CODES.KITKAT) 
     @SuppressLint("NewApi") 
     @Override 
     public void onTick(long millisUntilFinished) { 

      long milis = millisUntilFinished; 
      String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(milis), 
      TimeUnit.MILLISECONDS.toMinutes(milis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milis)), 
      TimeUnit.MILLISECONDS.toSeconds(milis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milis))); 

      System.out.println(hms); 
      textViewTime.setText(hms); 
     } 

     @Override 
     public void onFinish() { 

      textViewTime.setText("Finished."); 
     } 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

Но есть один большой недостаток, он может рассчитывать только время от начала значения, которое фиксируется. Как вы можете видеть, я добавляю новые поля edittext для изменения значений часов, минут и секунд, но это не работает, и я совершенно не понимаю, почему.

Любое предложение, что я сделал не так?

ответ

1

Ваш таймер фиксирован в начальном значении, потому что не инициализирует статическое время старения в событии нажатия кнопки запуска, поэтому таймер берет свое начальное значение.

Надежда этот класс будет уточнить это, заменить этот метод OnCreate фрагмент кода в вашем классе Java здесь я изменил ваш старт нажмите событие также заменить сброса метод

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

    btnStart = (Button) findViewById(R.id.btnStart); 
    btnStop = (Button) findViewById(R.id.btnStop); 
    textViewTime = (TextView) findViewById(R.id.textViewTime); 
    editHours = (EditText) findViewById(R.id.editHours); 
    editMinutes = (EditText) findViewById(R.id.editMinutes); 
    editSeconds = (EditText) findViewById(R.id.editSeconds); 

    btnStart.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      Time = 3600 * Integer.parseInt(editHours.getText().toString()) 
        + 60 
        * Integer.parseInt(editMinutes.getText().toString()) 
        + Integer.parseInt(editSeconds.getText().toString()); 

      if (timer != null) { 
       timer.cancel(); 
       timer = null; 
      } 
      timer = new CounterClass(1000 * Time, 1000); 

      timer.start(); 
     } 
    }); 

    btnStop.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      timer.cancel(); 
      reset(); 
     } 
    }); 
} 
public void reset() { 
    if (timer != null) { 
     timer.cancel(); 
    } 
    editHours.setText("0"); 
    editMinutes.setText("0"); 
    editSeconds.setText("0"); 
    textViewTime.setText("0"); 
} 
+0

Thx, это было очень полезно, но есть дополнительные замечания - определение таймера не может быть окончательным. –

+0

Просто объявляйте время обратного отсчета как Filed переменную класса i.e \t private CounterClass таймер не локальная переменная, если не выполнена, тогда я выведу весь класс. –

0

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

+0

Да и это значение во все дни это то же самое. Но после того, как я нажимаю кнопку «Стоп», каждое текстовое поле очищается, поэтому я могу поместить новые значения. Но он не читается. Дополнительная информация в файле xml есть строка в каждом поле textedit: android: text = "0" Причина, если я не стану, моя программа не может работать. Я думаю, что это причина того, что всегда есть такая же ценность, но как ее восстановить? –

+0

Можете ли вы попробовать добавить нижеприведенный код внутри своей кнопки onClickListener: editHours = (EditText) findViewById (R.id.editHours); editMinutes = (EditText) findViewById (R.id.editMinutes); editSeconds = (EditText) findViewById (R.id.editSeconds); – NilZzz

+0

Также попробуйте удалить строки, в которых говорится о android: text = "1" из вашего xml, и вместо этого используйте editHours.setText ("1") и т. Д. В методе onCreate. – NilZzz

Смежные вопросы