Form Validation az űrlap összes mezőjének helyességének ellenőrzési folyamata az adatok szerverre küldése előtt. Az egyes mezők érvényesítésétől eltérően a Form Validation figyelembe veszi a mezők közötti összefüggéseket: jelszó megerősítése, egy mező másiktól való függése, feltételes kötelezőség. A Google Developers, 2026 adatai szerint a Form Validation-nak a küldéskor teljes egészében ellenőriznie kell az űrlapot, és összefoglalót kell adnia a felhasználónak az összes hibáról. A helyes űrlapérvényesítés 25-35%-kal növeli a regisztrációs konverziót és csökkenti a beviteli hibák számát.
Főbb pontok
A Form Validation egy olyan folyamat, amely biztosítja, hogy a felhasználó által az űrlapba bevitt összes adat megfelel az üzleti követelményeknek, mielőtt a szerverre kerülne. Az űrlapérvényesítés magában foglalja az egyes mezők külön-külön történő ellenőrzését, valamint keresztellenőrzéseket: egyezik-e a jelszó a megerősítéssel, van-e legalább egy jelölőnégyzet kiválasztva, ki vannak-e töltve az összes kötelező mező, helyes-e a dátum (pl. a születési dátum nem a jövőben van).
A különbség az egyszerű mezőérvényesítéstől az, hogy a Form Validation az űrlapot egységes egészként kezeli. Blokkolhatja a küldést, ha egy feltételes mező nincs kitöltve, vagy a hibák összefoglalóját jelenítheti meg egy párbeszédablakban. Összetett űrlapoknál (regisztráció, rendelés, kérdőív) az űrlapérvényesítés egy külön logikai réteg, amelyet a UI-tól függetlenül tesztelnek.
Az NN Group UX-kutatásai szerint a felhasználók 3-szor gyakrabban fejezik be az űrlap kitöltését, ha a hibákat közvetlenül a küldés után látják, nem pedig az egyes mezők után külön-külön. A legjobb eredményt azonban a kombináció adja: az egyszerű mezők azonnali érvényesítése (hossz, formátum) + teljes ellenőrzés küldéskor a keresztmezőkhöz és üzleti logikához.
A mezőérvényesítés arra a kérdésre válaszol: helyes-e a bevitel ebben a konkrét mezőben? Az email user@domain.com formátumú, a telefon számjegyekből áll, a jelszó hosszabb 6 karakternél. A mezőérvényesítés elszigetelt — nem függ más mezőktől és valós időben is végrehajtható. Eredmény: hiba egy adott mezőhöz vagy annak hiánya.
Az űrlapérvényesítés arra a kérdésre válaszol: elküldhető-e az űrlap egészében? Nemcsak az egyes mezőket veszi figyelembe, hanem azok kombinációit is: a jelszónak és a megerősítésnek egyeznie kell, a kezdő dátum nem lehet későbbi, mint a befejező dátum, a mezők összegének 100%-nak kell lennie. Az űrlapérvényesítés küldéskor történik és általános eredményt ad vissza: az űrlap érvényes vagy sem.
Architekturálisan a mezőérvényesítés a UI rétegben (fragment, ViewModel), az űrlapérvényesítés pedig a domain rétegben (use case, interactor) helyezkedik el. Ez lehetővé teszi az űrlapérvényesítés újrafelhasználását különböző UI komponensekben és annak emulátor nélküli tesztelését. A Clean Architecture-ben az űrlapérvényesítés üzleti szabály, nem UI logika.
| Kritérium | Mezőérvényesítés | Űrlapérvényesítés |
|---|---|---|
| Ellenőrzés tárgya | Egy mező | Az összes mező + azok összefüggései |
| Végrehajtás időpontja | Valós időben / fókuszvesztéskor | Űrlap küldésekor |
| Eredmény | Adott mező hibája | Űrlap általános állapota + hibalista |
| Architektúra réteg | UI réteg | Domain réteg |
Két fő megközelítése van a Form Validation-nak. Az első — imperatív: a fejlesztő ír egy függvényt, amely szekvenciálisan ellenőrzi az egyes mezőket és összegyűjti a hibák listáját. Ez a megközelítés egyszerűen megérthető, de a kód minden új mezővel növekszik. Egy 5 mezős űrlaphoz az imperatív megközelítés még kényelmes, 15 mezőhöz — már problémás.
A második megközelítés — deklaratív: az érvényesítési szabályokat annotációkkal vagy konfigurációval írják le. A könyvtár maga bejárja az összes mezőt, alkalmazza a szabályokat és visszaadja az eredményt. Példa: @Email annotáció az emailData mező felett, @ConfirmPassword a megerősítő mező felett. A deklaratív megközelítés 3-5-ször lerövidíti az érvényesítési kódot és olvashatóvá teszi.
A harmadik megközelítés — reaktív RxJava vagy Kotlin Flow használatával. Minden mező Observable vagy StateFlow-ként van reprezentálva. Az űrlapérvényesítés feliratkozik az összes mező változásaira és minden változásnál újraszámolja az általános állapotot. A küldőgomb automatikusan aktívvá válik, amikor az összes mező érvényes. Ez a megközelítés megköveteli a reaktív programozás megértését, de a legsimább UX-t nyújtja.
Vegyünk egy regisztrációs űrlapot három mezővel: email, jelszó és jelszó megerősítése. Az űrlapérvényesítés magában foglalja: az email ellenőrzését Patterns.EMAIL_ADDRESS segítségével, a jelszó ellenőrzését minimális 8 karakter hosszúságra és számjegy meglétére, a jelszó és megerősítés egyezésének ellenőrzését. Csak ha mindhárom ellenőrzés sikeres, az űrlap elküldhető.
data class RegistrationForm(
val email: String,
val password: String,
val confirmPassword: String
)
fun validateRegistration(form: RegistrationForm): ValidationResult {
if (!Patterns.EMAIL_ADDRESS.matcher(form.email).matches())
return ValidationResult(false, "Invalid email address")
if (form.password.length < 8)
return ValidationResult(false, "Password too short")
if (form.password != form.confirmPassword)
return ValidationResult(false, "Passwords do not match")
return ValidationResult(true)
}
A példában a validateRegistration elfogadja az űrlap data class-át és visszaadja a ValidationResult-ot. Ha legalább egy ellenőrzés nem sikeres, false kerül visszaadásra a megfelelő üzenettel. A küldőgomb kezelése a Result alapján történik: ha isValid = true, a gomb aktív. A valós idejű állapotfrissítéshez LiveData<ValidationResult> használható, és a gomb frissíthető bármely mező minden változásakor.
A reaktív megközelítés a Kotlin Flow-val lehetővé teszi az űrlap állapotának automatikus újraszámítását. Minden mező MutableStateFlow<String>-ként van reprezentálva, a combine pedig egyetlen Flow<ValidationResult>-ba egyesíti őket. A feliratkozás a UI-ban frissíti a küldőgombot manuális érvényesítés meghívása nélkül. Ezt a mintát a Google ajánlja a Jetpack Compose-hoz és az MVVM architektúrához.
Az Android Saripaar — a legnépszerűbb érvényesítő könyvtár Androidhoz. Lehetővé teszi a mezők és View-k közvetlen annotálását: @Email, @NotEmpty, @Password(min = 8, scheme = Password.Scheme.ALPHA_NUMERIC). Az érvényesítés egy sorral hívható: validator.validate() callback-kel. A Saripaar automatikusan beállítja a hibát a setError segítségével az EditText-en. A könyvtár egyedi annotációkat is támogat specifikus üzleti szabályokhoz.
RxBinding + RxJava — reaktív megközelítés külön érvényesítő könyvtár nélkül. Minden mező közzéteszi a változásokat az RxTextView.textChanges()-en keresztül. A combineLatest operátor egyesíti az összes mezőt és kiszámolja az általános állapotot. Előny: teljes irányítás az érvényesítési pipeline felett, debounce, throttle, filter hozzáadásának lehetősége. Hátrány: RxJava ismeretet igényel.
Material Design Components — beépített támogatás a TextInputLayout és TextInputEditText számára. A könyvtár nem biztosít magát az érvényesítést, de UI-t ad a hibák megjelenítéséhez: setError(), setHelperText(), setCounterEnabled(). Magához az érvényesítéshez továbbra is kézi logika vagy Saripaar szükséges. A Material Components a megjelenítésért felel, nem az ellenőrzésért.
Az első hiba — csak kliens oldali érvényesítés. A kliens oldali Form Validation az UX-re szolgál, nem a biztonságra. Egy támadó közvetlenül az API-hoz küldhet kérést, megkerülve az érvényesítést. A szervernek újra kell ellenőriznie az összes mezőt. A kliens érvényesítés nem lehet az egyetlen védelem — ez egy kiegészítő réteg a felhasználói kényelemért, nem az adatbiztonságért.
A második hiba — a küldőgomb blokkolása üzenetek nélkül. Ha a gomb inaktív, a felhasználónak látnia kell, mely mezőket kell javítani. A szürke gomb magyarázat nélkül — az alacsony űrlapkonverzió egyik leggyakoribb oka. Mindig jelenítse meg a mezőhibákat mellettük, még akkor is, ha a gomb blokkolva van. A felhasználónak meg kell értenie, mi akadályozza pontosan a küldést.
A harmadik hiba — a keresztmezők figyelmen kívül hagyása. Az egyes mezők külön-külön történő érvényesítése nem elegendő. A mezők függhetnek egymástól: jelszó és megerősítés, kezdő és befejező dátum, ország és város. A Form Validation-nak ellenőriznie kell ezeket az összefüggéseket. Csak az egyes mezők ellenőrzése hamis biztonságérzetet kelt — az űrlap összeegyeztethetetlen adatokkal küldhető el.
| Hiba | Következmény | Megoldás |
|---|---|---|
| Csak kliens érvényesítés | Biztonsági rés | Kötelező szerver ellenőrzés |
| Gomb üzenetek nélkül | Alacsony űrlapkonverzió | Mezőhibák megjelenítése |
| Nincs keresztellenőrzés | Összeegyeztethetetlen adatok | Mezőösszefüggések érvényesítése |
| Túl gyakori ellenőrzések | Felhasználó irritációja | Debounce és ellenőrzés fókuszvesztéskor |
Gyakran Ismételt Kérdések
A mezőérvényesítés egy értéket ellenőriz formátum vagy hossz alapján. A Form Validation az összes mezőt együtt ellenőrzi, beleértve a keresztellenőrzéseket is: jelszavak egyezése, mezők egymástól való függése. A mezőérvényesítés a UI rétegben, a Form Validation a domain rétegben üzleti szabályként történik.
Használja a reaktív megközelítést: egyesítse az összes mezőt egy Flow-ba vagy Observable-be, és iratkozzon fel a változásokra. Minden mezőváltozásnál számolja újra az űrlap általános állapotát. Ha az állapot érvényes — a gomb aktív. Használjon Kotlin Flow-t combine-nal vagy RxJava-t combineLatest-tel az automatikus frissítéshez.
Az Android Saripaar — a legjobb választás deklaratív érvényesítéshez annotációkkal. Ha a projekt RxJava-t használ — az RxBinding reaktív megközelítést biztosít külön könyvtár nélkül. Egyszerű űrlapokhoz a manuális érvényesítés Patterns és TextUtils segítségével külső függőségek nélkül is elegendő.
Kötelező. A kliens érvényesítés javítja az UX-et, de nem nyújt biztonságot. A szervernek újra kell ellenőriznie az összes adatot, mivel az API közvetlenül elérhető. Soha ne támaszkodjon csak a kliens érvényesítésre a helytelen vagy káros adatok elleni védelemben.
Jetpack Compose-ban használjon Kotlin Flow-t vagy StateFlow-t az egyes mezők állapotának tárolásához. Az érvényesítő függvény elfogadja az űrlap állapotát és visszaadja a ValidationResult-ot. A küldőgomb feliratkozik az általános állapotra. A hibák megjelenítéséhez használja az isError-t az OutlinedTextField-ben vagy TextField Compose-ban.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is