Kubwa
An Annotation based validation library for use with Android's DataBinding library in an MVVM architecture.
Install / Use
/learn @WesleyElliott/KubwaREADME
Kubwa
An Annotation based validation library for use with Android's DataBinding library in an MVVM architecture.
- Quick and easily add validation rules to ViewModels by annotating the class
- Annotation Processing to eliminate reflection and generate boilerplate validation classes
!Important!
The new v2.0.0 has some breaking changes related to Gradle. This library is no longer hosted on jCenter, and is now available via JitPack. Please see Download for more info on using the new version.
Code wise, this release has nothing new - so existing apps looking to target AndroidX can continue to use the library
Usage
- Simply annotate your ViewModel class with the validation rules need:
@Email(errorMessage = R.string.email_error)
@Password(errorMessage = R.string.password_error, scheme = PasswordRule.Scheme.ALPHA_NUMERIC_SYMBOLS)
public class LoginViewModel extends BaseObservable {
LoginViewModelValidator validator; // Generated when project is built
public LoginViewModel(Context contex) {
validator = new LoginViewModelValidator(context); // Instantiate the validator with a Context
}
}
Note: Each validation rule (@Email, @Password, etc) requires an errorMessage String resource parameter
For a list of annotation rules, check out the Annotations
- Make sure your layout and ViewModel are setup for DataBinding Layout.xml:
<layout>
<data>
<variable name="viewModel" type="com.wesleyelliott.kubwa.LoginViewModel" />
</data>
<LinearLayout>
<EditText
...
android:text="@={viewModel.email}"
app:error="@{viewModel.emailError}"/>
<EditText
...
android:text="@={viewModel.password}"
app:error="@{viewModel.passwordError}"/>
ViewModel:
public String getEmailError() {
return validator.getEmailErrorMessage();
}
public String getPasswordError() {
return validator.getPasswordErrorMessage();
}
- Validate each rule independantly, or all together (in the same order as the annotations):
private void login() {
// Either
validator.validateEmail(getEmail());
validator.validatePassword(getPassword());
// Or
validator.validateAll(getEmail(), getPassword());
notifyChange();
if (validator.isValid()) {
// Todo: Log user in
}
}
And thats it! notifyChange() will ensure the errors (if any) are shown on the correct EditText's
Download
Make sure your project level gradle config (build.gradle) has the jitpack repository:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Add the kubwa-compiler and kubwa-annotations and kubwa dependancies and make sure Android DataBinding is setup:
android {
...
dataBinding {
enabled = true
}
}
dependencies {
implementation 'com.github.WesleyElliott.Kubwa:kubwa:v2.0.0'
implementation 'com.github.WesleyElliott.Kubwa:kubwa-annotations:v2.0.0'
annotationProcessor 'com.github.WesleyElliott.Kubwa:kubwa-compiler:v2.0.0'
// Or if you're using Kotlin, kapt:
kapt 'com.github.WesleyElliott.Kubwa:kubwa-compiler:v2.0.0'
}
License
Copyright 2019 Wesley Elliott
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Related Skills
node-connect
349.9kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
109.8kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
349.9kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
349.9kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
