Error State είναι μια κατάσταση πεδίου εισόδου που σηματοδοτεί οπτικά εσφαλμένα δεδομένα. Στο Android, το Error State υλοποιείται μέσω του TextInputLayout.setError(), το οποίο τονίζει το περίγραμμα με κόκκινο χρώμα και εμφανίζει το κείμενο σφάλματος κάτω από το πεδίο. Σύμφωνα με το Material Design Guidelines, 2026, το Error State πρέπει να είναι αισθητό αλλά όχι επιθετικό: κόκκινο περίγραμμα, κείμενο σφάλματος, εικονίδιο. Η σωστή χρήση του Error State αυξάνει τη μετατροπή φορμών κατά 20-30%, καθώς ο χρήστης εντοπίζει και διορθώνει γρήγορα τα σφάλματα χωρίς απώλεια περιβάλλοντος.
Κύρια Σημεία
Error State είναι μια ειδική λειτουργία εμφάνισης πεδίου εισόδου που ενεργοποιείται όταν τα εισαγόμενα δεδομένα δεν πέρασαν την επικύρωση. Οπτικά, το Error State περιλαμβάνει τρία στοιχεία: αλλαγή χρώματος περιγράμματος ή φόντου του πεδίου (συνήθως σε κόκκινο), εμφάνιση μηνύματος κειμένου κάτω από το πεδίο με περιγραφή του σφάλματος και προαιρετικά — ένα εικονίδιο ή επισήμανση. Σκοπός του Error State είναι να τραβήξει αμέσως την προσοχή του χρήστη στο προβληματικό πεδίο και να προτείνει πώς να διορθώσει το σφάλμα.
Στο Android, το Error State υλοποιείται σε επίπεδο TextInputLayout από το Material Design Components. Το TextInputLayout περιβάλλει το EditText και διαχειρίζεται τις καταστάσεις του: normal, focused, error, disabled. Η μέθοδος setError(String) μεταφέρει το πεδίο σε κατάσταση σφάλματος, αλλάζει το χρώμα περιγράμματος και εμφανίζει το μήνυμα. Κατά την αλλαγή κειμένου ή την κλήση setError(null), το πεδίο επιστρέφει στο normal.
Σύμφωνα με το Material Design Guidelines, το Error State πρέπει να είναι αισθητό αλλά όχι κυρίαρχο. Το κόκκινο χρώμα περιγράμματος πρέπει να έρχεται σε αντίθεση με την κανονική κατάσταση αλλά να μην υπερφορτώνει τη διεπαφή. Το μήνυμα σφάλματος πρέπει να περιέχει συγκεκριμένες πληροφορίες για το πρόβλημα και τον τρόπο επίλυσής του. Το εικονίδιο σφάλματος (π.χ. κόκκινος κύκλος με θαυμαστικό) ενισχύει το οπτικό σήμα.
Η μέθοδος setError(CharSequence errorText) μεταφέρει το TextInputLayout σε κατάσταση σφάλματος. Η παράμετρος errorText είναι το κείμενο που εμφανίζεται κάτω από το πεδίο. Εάν μεταβιβαστεί null, το σφάλμα επαναφέρεται. Το TextInputLayout διαχειρίζεται το κινούμενο σχέδιο: το κείμενο σφάλματος εμφανίζεται με ομαλή μετάβαση, το περίγραμμα γίνεται κόκκινο. Το εικονίδιο σφάλματος (από προεπιλογή ένα θαυμαστικό σε κύκλο) εμφανίζεται στο τέλος του πεδίου.
Σημαντικές λεπτομέρειες: Το setErrorEnabled(true) πρέπει να κληθεί πριν από το setError για να δεσμευτεί χώρος για το μήνυμα σφάλματος. Διαφορετικά, όταν εμφανίζεται το σφάλμα, η διάταξη μπορεί να πηδήξει επειδή ο χώρος για το μήνυμα δεν είναι δεσμευμένος. Συνιστάται να ενεργοποιείτε πάντα την υποστήριξη σφάλματος στο XML μέσω app:errorEnabled="true" για να αποφύγετε τη μετατόπιση διάταξης.
Η μέθοδος setError επαναφέρεται αυτόματα κατά την αλλαγή κειμένου του πεδίου εάν η επιλογή setErrorEnabled(true) είναι ενεργοποιημένη. Αυτή η συμπεριφορά είναι βολική για επικύρωση σε πραγματικό χρόνο: μόλις ο χρήστης αρχίσει να διορθώνει το σφάλμα, το κόκκινο περίγραμμα εξαφανίζεται και το πεδίο επιστρέφει στην κανονική κατάσταση. Ωστόσο, για σύνθετα σενάρια, αυτή η αυτόματη επαναφορά μπορεί να είναι ανεπιθύμητη — σε τέτοιες περιπτώσεις, διαχειριστείτε το σφάλμα χειροκίνητα.
val til = findViewById<TextInputLayout>(R.id.til_email)
// Ενεργοποίηση υποστήριξης σφαλμάτων (ρύθμιση σε XML διαφορετικά)
til.isErrorEnabled = true
// Ορισμός μηνύματος σφάλματος
til.error = "Invalid email address"
// Εκκαθάριση σφάλματος
til.error = null
// Έλεγχος αν υπάρχει σφάλμα
if (til.error != null) {
// Το πεδίο βρίσκεται σε κατάσταση σφάλματος
}
Στο παράδειγμα χρησιμοποιούνται ιδιότητες Kotlin για πρόσβαση σε setError/isErrorEnabled. Το TextInputLayout ενημερώνει αυτόματα το UI: αλλάζει το χρώμα boxStrokeColor, εμφανίζει το εικονίδιο σφάλματος, δείχνει το κείμενο σφάλματος. Εάν αλλάξετε το κείμενο στο EditText, το σφάλμα επαναφέρεται αυτόματα. Για χειροκίνητη επαναφορά, ορίστε error = null.
Δεν χρησιμοποιούν όλα τα έργα το Material Design Components. Για προσαρμοσμένη εμφάνιση σφάλματος, μπορείτε να χρησιμοποιήσετε ένα ξεχωριστό TextView κάτω από το EditText που γίνεται ορατό κατά το σφάλμα. Αυτή η προσέγγιση δίνει πλήρη έλεγχο στα στυλ και τη θέση του μηνύματος. Για παράδειγμα, μπορείτε να τοποθετήσετε το μήνυμα στα δεξιά του πεδίου, να χρησιμοποιήσετε διαφορετικό χρώμα φόντου ή να προσθέσετε ένα εικονίδιο στα αριστερά του κειμένου.
Στο Jetpack Compose, το Error State υλοποιείται μέσω της παραμέτρου isError στο OutlinedTextField ή TextField. Όταν isError = true, το περίγραμμα γίνεται κόκκινο και μπορείτε να εμφανίσετε το κείμενο σφάλματος μέσω supportingText. Το Compose δεν έχει ενσωματωμένο αυτόματο καθαρισμό κατά την αλλαγή κειμένου — ο προγραμματιστής διαχειρίζεται την κατάσταση σφάλματος χειροκίνητα μέσω remember και mutableStateOf.
Για σφάλμα ομάδας (ένα μήνυμα για πολλά πεδία, π.χ. “Συμπληρώστε όλα τα υποχρεωτικά πεδία”) χρησιμοποιείται Snackbar, Dialog ή ενσωματωμένο μπλοκ στο επάνω μέρος της φόρμας. Το σφάλμα ομάδας δεν αντικαθιστά το Error State των μεμονωμένων πεδίων, αλλά το συμπληρώνει. Ο χρήστης βλέπει πρώτα το γενικό μήνυμα και στη συνέχεια αναζητά συγκεκριμένα πεδία με σφάλματα.
| Μέθοδος | Πλεονεκτήματα | Μειονεκτήματα | Πότε να χρησιμοποιείται |
|---|---|---|---|
| TextInputLayout.setError | Τυπικό, κινούμενο σχέδιο, αυτόματος καθαρισμός | Μόνο με Material Components | Κύρια επιλογή για MDC |
| Ξεχωριστό TextView | Πλήρης έλεγχος στυλ | Απαιτεί χειροκίνητη διαχείριση ορατότητας | Προσαρμοσμένα θέματα, χωρίς MDC |
| Compose isError | Ενσωματωμένο στο Compose | Χειροκίνητη διαχείριση κατάστασης | Έργα Jetpack Compose |
| Snackbar/Dialog | Μήνυμα ομάδας | Δεν συνδέεται με συγκεκριμένο πεδίο | Συμπλήρωμα στο Error State πεδίου |
Το χρώμα του Error State στο Material Design Components διαχειρίζεται μέσω του χαρακτηριστικού boxStrokeErrorColor ή του χαρακτηριστικού colorError στο θέμα. Από προεπιλογή χρησιμοποιείται το κόκκινο χρώμα συστήματος, αλλά μπορεί να παρακαμφθεί στο θέμα της εφαρμογής ή απευθείας στο TextInputLayout μέσω app:boxStrokeErrorColor="@color/customErrorColor". Για υποστήριξη σκοτεινού θέματος, συνιστάται η χρήση επιλογέα με διαφορετικά χρώματα για λειτουργία φωτεινής και σκοτεινής λειτουργίας.
Εικονίδιο σφάλματος διαμορφώνεται μέσω app:errorIconDrawable. Από προεπιλογή εμφανίζεται ένα θαυμαστικό σε κύκλο. Μπορεί να αντικατασταθεί με προσαρμοσμένο εικονίδιο ή να αφαιρεθεί εντελώς ορίζοντας app:errorIconDrawable="@null". Το εικονίδιο εμφανίζεται στο τέλος του TextInputLayout και χρησιμεύει ως πρόσθετος οπτικός δείκτης. Στο Material Design 3, το εικονίδιο σφάλματος είναι υποχρεωτικό για προσβασιμότητα.
Κινούμενο σχέδιο εμφάνισης σφάλματος είναι ενσωματωμένο στο TextInputLayout: το κείμενο εμφανίζεται από κάτω με ομαλή αλλαγή αδιαφάνειας. Για προσαρμοσμένο κινούμενο σχέδιο, χρησιμοποιήστε Transition API ή MotionLayout. Για παράδειγμα, η δόνηση του πεδίου κατά το σφάλμα προσελκύει πρόσθετη προσοχή. Αλλά η υπερβολική χρήση κινούμενου σχεδίου χειροτερεύει την εμπειρία χρήστη — η ομαλή εμφάνιση του μηνύματος είναι αρκετή.
Η διαχείριση του Error State χωρίζεται σε δύο στάδια: ρύθμιση σφάλματος κατά την επικύρωση πεδίου και επαναφορά σφάλματος κατά τη διόρθωση. Στην απλούστερη περίπτωση, η επικύρωση καλείται στο TextWatcher.afterTextChanged: εάν η τιμή δεν είναι έγκυρη, καλείται setError με μήνυμα σφάλματος. Εάν είναι έγκυρη — setError(null). Το TextInputLayout κρύβει αυτόματα το σφάλμα όταν το setError(null) επαναφέρει την κατάσταση.
Για επικύρωση φόρμας, τα σφάλματα ορίζονται στο στάδιο υποβολής της φόρμας. Διαπέραση όλων των πεδίων, έλεγχος κάθε ενός, ρύθμιση σφαλμάτων για μη έγκυρα πεδία και εστίαση στο πρώτο πεδίο με σφάλμα. Το κουμπί υποβολής μπλοκάρεται κατά τη διάρκεια αυτού. Εάν η φόρμα είναι μεγάλη, συνιστάται η κύλιση της οθόνης στο πρώτο πεδίο με σφάλμα και η αυτόματη εστίαση σε αυτό.
Ο κανόνας single error focus: κατά την υποβολή φόρμας, ορίστε εστίαση μόνο στο πρώτο πεδίο με σφάλμα. Ο χρήστης διορθώνει ένα σφάλμα κάθε φορά και μετά τη διόρθωση, το επόμενο πεδίο με σφάλμα λαμβάνει αυτόματα εστίαση. Αυτή η βήμα-προς-βήμα προσέγγιση μειώνει το γνωστικό φορτίο. Το Material TextInputLayout δεν παρακολουθεί την εστίαση κατά τον ορισμό σφάλματος — αυτό πρέπει να γίνει χειροκίνητα μέσω requestFocus().
Πρώτο λάθος — έλλειψη isErrorEnabled. Εάν το setErrorEnabled δεν κληθεί πριν από το setError, η διάταξη μπορεί να μετατοπιστεί όταν εμφανίζεται το μήνυμα σφάλματος. Αυτό είναι ιδιαίτερα κρίσιμο εάν το πεδίο βρίσκεται στη μέση της οθόνης — ο χρήστης χάνει τη θέση κύλισης. Πάντα ενεργοποιείτε το setErrorEnabled(true) στο XML μέσω app:errorEnabled="true" ή προγραμματιστικά πριν από τον ορισμό σφάλματος.
Δεύτερο λάθος — πολύ μεγάλο μήνυμα σφάλματος. Το μεγάλο κείμενο αναδιπλώνεται σε πολλές γραμμές και μπορεί να καλύψει γειτονικά πεδία. Το συνιστώμενο μήκος μηνύματος σφάλματος είναι 20-40 χαρακτήρες. Εάν απαιτούνται περισσότερες πληροφορίες, χρησιμοποιήστε helperText (υπόδειξη) σε κανονική κατάσταση ή επεξήγηση εργαλείου για πρόσθετη εξήγηση. Η συντομία είναι η βάση ενός καλού Error State.
Τρίτο λάθος — αγνόηση προσβασιμότητας. Το Error State πρέπει να είναι προσβάσιμο για αναγνώστες οθόνης. Το TextInputLayout ανακοινώνει αυτόματα το σφάλμα μέσω contentDescription, αλλά οι προσαρμοσμένες υλοποιήσεις πρέπει να το κάνουν χειροκίνητα. Χρησιμοποιήστε announceForAccessibility() ή android:importantForAccessibility για μηνύματα σφάλματος. Οι χρήστες TalkBack πρέπει να ακούσουν το σφάλμα αμέσως μετά την εμφάνισή του.
| Λάθος | Πρόβλημα | Λύση |
|---|---|---|
| Χωρίς isErrorEnabled | Μετατόπιση διάταξης κατά το σφάλμα | app:errorEnabled="true" στο XML |
| Μεγάλο μήνυμα | Κάλυψη γειτονικών πεδίων | 20-40 χαρακτήρες, helperText για λεπτομέρειες |
| Χωρίς προσβασιμότητα | Ο αναγνώστης οθόνης δεν ακούει το σφάλμα | Σημαντικό για χρήστες TalkBack |
| Αυτόματη επαναφορά χωρίς έλεγχο | Το πεδίο θεωρείται λανθασμένα έγκυρο | Χειροκίνητη διαχείριση επαναφοράς σφάλματος |
Συχνές Ερωτήσεις
Εάν χρησιμοποιείτε TextInputLayout, καλέστε setError(null). Ενεργοποιήστε το setErrorEnabled(true) ώστε ο χώρος κάτω από το μήνυμα να παραμείνει δεσμευμένος, αλλά το κείμενο να εξαφανιστεί. Κατά την αλλαγή κειμένου στο EditText, το TextInputLayout επαναφέρει αυτόματα το σφάλμα. Για χειροκίνητη διαχείριση, χρησιμοποιήστε addTextChangedListener και setError(null) σε κάθε αλλαγή.
Επειδή ο χώρος για το μήνυμα σφάλματος δεν είναι δεσμευμένος. Λύση: ενεργοποιήστε το app:errorEnabled="true" στο XML για το TextInputLayout. Αυτό θα δεσμεύσει χώρο για το μήνυμα και η διάταξη δεν θα μετατοπιστεί. Εάν το σφάλμα δεν είναι ενεργό, ο χώρος παραμένει κενός, αλλά η διάταξη είναι σταθερή.
Χρησιμοποιήστε το χαρακτηριστικό app:boxStrokeErrorColor στο XML ή προγραμματιστικά μέσω til.setBoxStrokeErrorStateList(). Το χρώμα μπορεί να οριστεί με επιλογέα για διαφορετικές καταστάσεις. Μπορείτε επίσης να παρακάμψετε το χαρακτηριστικό συστήματος colorError στο θέμα της εφαρμογής για να αλλάξετε το χρώμα σφάλματος καθολικά για όλα τα πεδία.
Ναι, χρησιμοποιήστε app:errorEnabled="true" και setError() — αλλά παρακάμψτε το boxStrokeErrorColor στο κύριο χρώμα του πεδίου. Το εικονίδιο και το κείμενο σφάλματος θα είναι ακόμα ορατά, αλλά το περίγραμμα θα παραμείνει στο αρχικό χρώμα. Ωστόσο, αυτό μειώνει την ορατότητα σφάλματος, το οποίο έρχεται σε αντίθεση με τις συστάσεις του Material Design για προσβασιμότητα.
Στο Compose, χρησιμοποιήστε isError = true στο OutlinedTextField ή TextField. Το κείμενο σφάλματος μεταβιβάζεται μέσω της παραμέτρου supportingText. Διαχειριστείτε την κατάσταση μέσω mutableStateOf. Κατά την αλλαγή κειμένου, επαναφέρετε το isError χειροκίνητα. Το Compose δεν έχει αυτόματο καθαρισμό σφάλματος, σε αντίθεση με το TextInputLayout στο σύστημα View.
Περίληψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης