Skocz do zawartości

Wykryliśmy, że używasz AdBlocka  :emo_im_sad:

Proszę, dodaj nas do wyjątków:) Wyświetlamy jedynie ładne, idealnie dopasowane reklamy - żadnych wyskakujących okienek czy wideo! Reklamy to jedyne źródło utrzymania naszej społeczności.

Kliknij tutaj, aby dowiedzieć się jak to zrobić. Dziękujemy!

Dobrze znasz WordPressa? Czytaj więcej.. ×
kacper635

W jaki sposób napisać aplikację która będzie odliczać czas?

    Rekomendowane odpowiedzi

    Napisano (edytowane)

    Witam. Chciałbym zrobić taką aplikację, której jedna część była by odpowiedzialna za odliczanie czasu. Chodzi o odliczanie czasu do dzwonka. 
    Tzn w jednej z aktywnosci uzytkownik wpisuje godziny w których zaczynają się lekcję, a w innej aktywnosci mamy odliczanie czasu do dzwonka. Pobierało by to informacje o godzinie jaką mamy obecnie i odliczało czas do najbliższego dzwonka. Jest coś takiego możliwe?

    Edytowane przez mmaciejow
    poprawa tematu

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Napisano (edytowane)

    Oczywiście! Do realizacji tego zadania można posłużyć się klasą  CountDownTimer. Poniżej  przykład jak jej używać.

    MainActivity:

    package tutorial.android.com.pl.timerexample
    
    import android.support.v7.app.AppCompatActivity
    import android.os.Bundle
    import android.os.CountDownTimer
    import android.widget.Toast
    import kotlinx.android.synthetic.main.activity_main.*
    import java.util.*
    
    class MainActivity : AppCompatActivity() {
    
        private val countDownInterval = 1000L //1 sekunda
    
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            start_button.setOnClickListener { startCountDown() }
        }
    
        private fun startCountDown() {
            time_picker.hour
            time_picker.minute
    
            val cal = Calendar.getInstance()
            val hourNow = cal.get(Calendar.HOUR_OF_DAY)
            val minNow = cal.get(Calendar.MINUTE)
            val secNow = cal.get(Calendar.SECOND)
    
    
            val millisInFuture = calculateMillisec(hourNow, minNow, secNow)
    
            val mCountDownTimer = object : CountDownTimer(millisInFuture, countDownInterval) {
    
                override fun onTick(millisUntilFinished: Long) {
                    left_time.text = "Pozostało:  ${millisUntilFinished / 1000} sekund"
                }
    
                override fun onFinish() {
                    showToast("CZAS MINĄŁ!")
                }
            }
            mCountDownTimer.start()
        }
    
        private fun showToast(text: String) {
            Toast.makeText(this, text, Toast.LENGTH_SHORT).show()
        }
    
        private fun calculateMillisec(hourNow: Int, minNow: Int, secNow: Int): Long {
            val hoursToEndinMs = (time_picker.hour - hourNow) * 3600000L //zamiana z godzin na milisekundy
            val minutesToEndinMs = (time_picker.minute - minNow) * 60000L //zamiana z minut na milisekundy
            val secondToEndinMs = 60000L - secNow * 1000L //zamiana z sekund na milisekundy
            return hoursToEndinMs + minutesToEndinMs + secondToEndinMs
        }
    }

    activity_main.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <TimePicker
            android:id="@+id/time_picker"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_marginEnd="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            android:timePickerMode="spinner"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
    
        <Button
            android:id="@+id/start_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:background="@color/colorPrimary"
            android:text="Start"
            android:visibility="visible"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/time_picker" />
    
        <TextView
            android:id="@+id/left_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="8dp"
            android:text=""
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/start_button" />
    
    </android.support.constraint.ConstraintLayout>

    Zrzut ekranu z aplikacji:

    image.png.811acfc87117a7b4ba74f06b1d8d1977.png

    Jest to bardzo prosty przykład, ale na jego podstawie można zbudować coś poważniejszego 😉 W Twoim przypadku musisz zastanowić się w jaki sposób przechowywać godziny w których zaczynają/kończą się lekcję. Nie chcesz przecież zmuszać użytkowników do wpisywania tych danych, za każdym razem gdy będą chcieli skorzystać z aplikacji. Możesz zczytywać dane z pliku ( np. JSON), możesz utworzyć małą bazę danych (SQLite) To jednak temat na osobny wątek 🙂

    Edytowane przez Coders Lab

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Możesz manipulować i wyświetlać co tylko chcesz ;) Musisz tylko odpowiednio zmieniać implementacje metody onTick. Na przykład na taką:

                override fun onTick(millisUntilFinished: Long) {
    
                    val minutes = TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)
                    val seconds = TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - TimeUnit.MINUTES.toSeconds(minutes)
    
                    left_time.text = "Pozostało:  $minutes minut, $seconds sekund"
                }

     

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    To jest napisane w kotlinie tak? Da się to na jave przetłumaczyć żeby działało u mnie?

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Jeżeli używasz Android Studio, kotlin również powinien działać u Ciebie. Można nawet zamiennie pisać  klasy w javie, a niektóre w kotlinie. Jednaj jeżeli zależy Ci na kodzie napisanym w javie, to można dokonać konwersji.
    informacje jak to zrobić znajdziesz tutaj:

    Sam przekonwertowany kod wklejam poniżej:
     

    public final class MainActivity extends AppCompatActivity {
        private final long countDownInterval = 1000L;
        private HashMap _$_findViewCache;
    
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            this.setContentView(R.layout.activity_main);
            ((Button) this._$_findCachedViewById(id.start_button)).setOnClickListener((OnClickListener) (new OnClickListener() {
                public final void onClick(View it) {
                    startCountDown();
                }
            }));
        }
    
        private final void startCountDown() {
            TimePicker var10000 = (TimePicker) this._$_findCachedViewById(id.time_picker);
            var10000.getHour();
            var10000 = (TimePicker) this._$_findCachedViewById(id.time_picker);
            var10000.getMinute();
            Calendar cal = Calendar.getInstance();
            int hourNow = cal.get(Calendar.HOUR_OF_DAY);
            int minNow = cal.get(Calendar.MINUTE);
            int secNow = cal.get(Calendar.SECOND);
            final long millisInFuture = this.calculateMillisec(hourNow, minNow, secNow);
            CountDownTimer mCountDownTimer = new CountDownTimer(millisInFuture, this.countDownInterval) {
                public void onTick(long millisUntilFinished) {
                    long minutes = TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished);
                    long seconds = TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) - TimeUnit.MINUTES.toSeconds(minutes);
                    TextView var10000 = (TextView)  findViewById(id.left_time);
                    var10000.setText((CharSequence) ("Pozostało:  " + minutes + " minut, " + seconds + " sekund"));
                }
    
                public void onFinish() {
                    showToast("CZAS MINĄŁ!");
                }
            };
            mCountDownTimer.start();
        }
    
        private final void showToast(String text) {
            Toast.makeText((Context) this, (CharSequence) text, Toast.LENGTH_SHORT).show();
        }
    
        private final long calculateMillisec(int hourNow, int minNow, int secNow) {
            TimePicker var10000 = (TimePicker) this._$_findCachedViewById(id.time_picker);
            long hoursToEndinMs = (long) (var10000.getHour() - hourNow) * 3600000L;
            var10000 = (TimePicker) this._$_findCachedViewById(id.time_picker);
            long minutesToEndinMs = (long) (var10000.getMinute() - minNow) * 60000L;
            long secondToEndinMs = 60000L - (long) secNow * 1000L;
            return hoursToEndinMs + minutesToEndinMs + secondToEndinMs;
        }
    
        public View _$_findCachedViewById(int var1) {
            if (this._$_findViewCache == null) {
                this._$_findViewCache = new HashMap();
            }
    
            View var2 = (View) this._$_findViewCache.get(var1);
            if (var2 == null) {
                var2 = this.findViewById(var1);
                this._$_findViewCache.put(var1, var2);
            }
    
            return var2;
        }
    }

     

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Pokaż jakie błędy dostajesz, albo dodaj cały projekt jako załącznik. Zakładam że mogłeś nie dodać potrzebnych importów.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

    Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

    Zarejestruj nowe konto

    Załóż nowe konto. To bardzo proste!

    Zarejestruj się

    Zaloguj się

    Posiadasz już konto? Zaloguj się poniżej.

    Zaloguj się

    • Przeglądający   1 użytkownik

      • kacper635
    ×