• Καλώς ήρθατε στο Μαθήματα Ανάπτυξης Λογισμικού & Κωδικοποίησης.
 

Kotlin: Κατασκευή Απλού Χρονομέτρου – Οδηγός και Παραδείγματα

Ξίνηε από Arzuy, Απρ 01, 2025, 12:02 ΜΜ

« προηγούενο - εόμνο »

Arzuy

Η Kotlin είναι μια σύγχρονη γλώσσα προγραμματισμού που χρησιμοποιείται ευρέως για την ανάπτυξη εφαρμογών Android. Σε αυτό το άρθρο, θα δείξουμε πώς να δημιουργήσετε ένα απλό χρονόμετρο (stopwatch) χρησιμοποιώντας την Kotlin. Θα σας δώσουμε έναν πλήρη οδηγό με παραδείγματα κώδικα για να ξεκινήσετε εύκολα. Αυτός ο οδηγός είναι ιδανικός για αρχάριους και για όσους θέλουν να εξασκήσουν τις δεξιότητές τους στην Kotlin.

Τι θα χρειαστούμε;
Για να φτιάξουμε ένα απλό χρονόμετρο, θα χρησιμοποιήσουμε:
  • Μια διεπαφή χρήστη (UI) με κουμπιά για έναρξη, παύση και επαναφορά.
  • Την κλάση CountDownTimer ή έναν χειροκίνητο χρονοδιακόπτη με Handler.
  • Βασικές γνώσεις Kotlin και XML για το layout.
Ας ξεκινήσουμε!

Βήμα 1: Ρύθμιση του Layout (XML)
Πρώτα, δημιουργούμε το layout της εφαρμογής στο αρχείο activity_main.xml:

Κώδικας [Επιογή]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="16dp">

    <TextView
        android:id="@+id/timerText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="00:00"
        android:textSize="40sp"
        android:textStyle="bold"/>

    <Button
        android:id="@+id/startButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Έναρξη"
        android:layout_marginTop="20dp"/>

    <Button
        android:id="@+id/pauseButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Παύση"
        android:layout_marginTop="10dp"/>

    <Button
        android:id="@+id/resetButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Επαναφορά"
        android:layout_marginTop="10dp"/>

</LinearLayout>


Αυτό το layout περιλαμβάνει ένα TextView για την εμφάνιση του χρόνου και τρία κουμπιά: Έναρξη, Παύση και Επαναφορά.

Βήμα 2: Κώδικας Kotlin για το Χρονόμετρο
Στο αρχείο MainActivity.kt, υλοποιούμε τη λογική του χρονομέτρου χρησιμοποιώντας έναν Handler για να ενημερώνουμε το χρόνο κάθε δευτερόλεπτο.

Κώδικας [Επιογή]
package com.example.stopwatch

import android.os.Bundle
import android.os.Handler
import android.os.Looper
import androidx.appcompat.app.AppCompatActivity
import com.example.stopwatch.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding
    private var seconds = 0
    private var isRunning = false
    private val handler = Handler(Looper.getMainLooper())

    private val runnable = object : Runnable {
        override fun run() {
            if (isRunning) {
                seconds++
                updateTimerText()
                handler.postDelayed(this, 1000) // Εκτέλεση κάθε 1 δευτερόλεπτο
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // Κουμπί Έναρξης
        binding.startButton.setOnClickListener {
            if (!isRunning) {
                isRunning = true
                handler.post(runnable)
            }
        }

        // Κουμπί Παύσης
        binding.pauseButton.setOnClickListener {
            isRunning = false
            handler.removeCallbacks(runnable)
        }

        // Κουμπί Επαναφοράς
        binding.resetButton.setOnClickListener {
            isRunning = false
            handler.removeCallbacks(runnable)
            seconds = 0
            updateTimerText()
        }

        updateTimerText()
    }

    private fun updateTimerText() {
        val minutes = seconds / 60
        val secs = seconds % 60
        val time = String.format("%02d:%02d", minutes, secs)
        binding.timerText.text = time
    }
}



Επεξήγηση του Κώδικα
  • Μεταβλητές:
    • seconds: Μετράει τα δευτερόλεπτα.
    • isRunning: Ελέγχει αν το χρονόμετρο τρέχει.
    • handler: Εκτελεί τον κώδικα σε τακτά χρονικά διαστήματα.
  • Runnable: Ενημερώνει τον χρόνο κάθε δευτερόλεπτο αν το isRunning είναι true.
  • Λειτουργίες Κουμπιών:
    • Έναρξη: Ξεκινά το χρονόμετρο.
    • Παύση: Σταματά το χρονόμετρο χωρίς να μηδενίζει τον χρόνο.
    • Επαναφορά: Μηδενίζει τον χρόνο και σταματά το χρονόμετρο.
  • updateTimerText: Μετατρέπει τα δευτερόλεπτα σε μορφή "MM:SS" και ενημερώνει το TextView.

Εναλλακτική Μέθοδος με CountUpTimer
Αν θέλετε μια πιο προσαρμοσμένη λύση, μπορείτε να δημιουργήσετε μια κλάση CountUpTimer:

Κώδικας [Επιογή]
abstract class CountUpTimer(private val interval: Long) {
    private var handler = Handler(Looper.getMainLooper())
    private var elapsedTime = 0L

    private val runnable = object : Runnable {
        override fun run() {
            elapsedTime += interval
            onTick(elapsedTime)
            handler.postDelayed(this, interval)
        }
    }

    fun start() {
        handler.post(runnable)
    }

    fun stop() {
        handler.removeCallbacks(runnable)
    }

    fun reset() {
        stop()
        elapsedTime = 0L
        onTick(elapsedTime)
    }

    abstract fun onTick(millisElapsed: Long)
}

// Χρήση στην MainActivity
val timer = object : CountUpTimer(1000) {
    override fun onTick(millisElapsed: Long) {
        val secs = millisElapsed / 1000
        val minutes = secs / 60
        val seconds = secs % 60
        binding.timerText.text = String.format("%02d:%02d", minutes, seconds)
    }
}

binding.startButton.setOnClickListener { timer.start() }
binding.pauseButton.setOnClickListener { timer.stop() }
binding.resetButton.setOnClickListener { timer.reset() }



Συμβουλές για τη Βελτίωση
  • Στυλ: Προσαρμόστε το UI με χρώματα και γραμματοσειρές.
  • Ακρίβεια: Χρησιμοποιήστε μικρότερα διαστήματα (π.χ. 100ms) για πιο ακριβές χρονόμετρο.
  • Αποθήκευση: Αποθηκεύστε τον χρόνο σε SharedPreferences για να μην χαθεί κατά την περιστροφή οθόνης.

Συμπέρασμα
Η δημιουργία ενός απλού χρονομέτρου στην Kotlin είναι ένας εξαιρετικός τρόπος να μάθετε βασικές έννοιες όπως η διαχείριση γεγονότων και η ενημέρωση της διεπαφής χρήστη. Με τα παραδείγματα που δώσαμε, μπορείτε να ξεκινήσετε άμεσα και να προσαρμόσετε τον κώδικα στις δικές σας ανάγκες. Δοκιμάστε το και εξερευνήστε περισσότερες δυνατότητες της Kotlin!