diff --git a/README.md b/README.md index 915eef3..d20a880 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ #### 1. Add gradle dependency ```groovy -implementation 'com.mlykotom:valifi:1.4.2' +implementation 'com.mlykotom:valifi:1.5.0' ``` #### 2. Setup project with data binding ``` groovy diff --git a/build.gradle b/build.gradle index 5024de9..b09e3dd 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.5.0' + classpath 'com.android.tools.build:gradle:3.5.2' // Required plugins added to classpath to facilitate pushing to Jcenter/Bintray classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.0' classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' diff --git a/example-android/build.gradle b/example-android/build.gradle index 8bd896d..fe6d65b 100644 --- a/example-android/build.gradle +++ b/example-android/build.gradle @@ -26,12 +26,12 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'androidx.appcompat:appcompat:1.0.2' + implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'com.google.android.material:material:1.0.0' if (isLocalBuild) { implementation project(':valifi') } else { - implementation 'com.mlykotom:valifi:1.4.2' + implementation 'com.mlykotom:valifi:1.5.0' } } diff --git a/example-android/src/main/AndroidManifest.xml b/example-android/src/main/AndroidManifest.xml index f416289..56e2ab8 100644 --- a/example-android/src/main/AndroidManifest.xml +++ b/example-android/src/main/AndroidManifest.xml @@ -1,5 +1,4 @@ - - diff --git a/example-arch-viewmodel/build.gradle b/example-arch-viewmodel/build.gradle index 7c6ab5c..512b3ca 100644 --- a/example-arch-viewmodel/build.gradle +++ b/example-arch-viewmodel/build.gradle @@ -28,18 +28,18 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'androidx.appcompat:appcompat:1.0.2' + implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'com.google.android.material:material:1.0.0' - implementation "androidx.lifecycle:lifecycle-extensions:2.0.0" + implementation "androidx.lifecycle:lifecycle-extensions:2.1.0" debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.2' releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.2' testImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.2' - if(isLocalBuild) { + if (isLocalBuild) { implementation project(':valifi') } else { - implementation 'com.mlykotom:valifi:1.4.2' + implementation 'com.mlykotom:valifi:1.5.0' } } diff --git a/example-arch-viewmodel/src/main/AndroidManifest.xml b/example-arch-viewmodel/src/main/AndroidManifest.xml index 7575c5b..604c8f1 100644 --- a/example-arch-viewmodel/src/main/AndroidManifest.xml +++ b/example-arch-viewmodel/src/main/AndroidManifest.xml @@ -4,8 +4,8 @@ diff --git a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/ExampleViewModelActivity.java b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/ExampleViewModelActivity.java index c13cb89..bdc7778 100644 --- a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/ExampleViewModelActivity.java +++ b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/ExampleViewModelActivity.java @@ -1,26 +1,25 @@ package com.mlykotom.example_arch_viewmodel; import android.os.Bundle; -import androidx.annotation.Nullable; -import com.google.android.material.tabs.TabLayout; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentStatePagerAdapter; -import androidx.viewpager.widget.ViewPager; -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; +import com.google.android.material.tabs.TabLayout; import com.mlykotom.example_arch_viewmodel.form.FormValidationFragment; import com.mlykotom.example_arch_viewmodel.manual.ManualValidationFragment; import com.mlykotom.example_arch_viewmodel.single.SingleValidationFragment; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; +import androidx.viewpager.widget.ViewPager; public class ExampleViewModelActivity extends AppCompatActivity { private PagesAdapter mAdapter; private ViewPager mViewPager; private TabLayout mTabLayout; - @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -29,14 +28,12 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { setupAdapter(); } - private void setupActionbar() { Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setTitle("ValiFi example"); setSupportActionBar(toolbar); } - private void setupAdapter() { mViewPager = findViewById(R.id.pager); mTabLayout = findViewById(R.id.tabs); @@ -47,19 +44,16 @@ private void setupAdapter() { mTabLayout.setupWithViewPager(mViewPager); } - private static class PagesAdapter extends FragmentStatePagerAdapter { private static String[] sTitles = new String[]{"Single", "Form", "Manual"}; - public PagesAdapter(FragmentManager fm) { super(fm); } - @Override public Fragment getItem(int position) { - switch(position) { + switch (position) { case 0: default: return SingleValidationFragment.newInstance(); @@ -72,13 +66,11 @@ public Fragment getItem(int position) { } } - @Override public int getCount() { return sTitles.length; } - @Override public CharSequence getPageTitle(int position) { return sTitles[position]; diff --git a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/ExampleViewModelApplication.java b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/ExampleViewModelApplication.java index dba7cf3..d159813 100644 --- a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/ExampleViewModelApplication.java +++ b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/ExampleViewModelApplication.java @@ -5,7 +5,6 @@ import com.mlykotom.valifi.ValiFi; import com.squareup.leakcanary.LeakCanary; - public class ExampleViewModelApplication extends Application { @Override public void onCreate() { diff --git a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/MyValiFieldCaptcha.java b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/MyValiFieldCaptcha.java index 26a440b..8fe5adf 100644 --- a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/MyValiFieldCaptcha.java +++ b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/MyValiFieldCaptcha.java @@ -1,9 +1,8 @@ package com.mlykotom.example_arch_viewmodel; -import androidx.annotation.Nullable; - import com.mlykotom.valifi.fields.ValiFieldText; +import androidx.annotation.Nullable; /** * Custom validator that extends text validator @@ -14,13 +13,11 @@ public MyValiFieldCaptcha() { addMyValidator(); } - public MyValiFieldCaptcha(String defaultValue) { super(defaultValue); addMyValidator(); } - private void addMyValidator() { addCustomValidator("Captcha must be correct", new PropertyValidator() { @Override diff --git a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/form/FormValidationFragment.java b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/form/FormValidationFragment.java index 35452eb..32e6b05 100644 --- a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/form/FormValidationFragment.java +++ b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/form/FormValidationFragment.java @@ -1,10 +1,6 @@ package com.mlykotom.example_arch_viewmodel.form; -import androidx.lifecycle.ViewModelProviders; import android.os.Bundle; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -12,12 +8,15 @@ import com.mlykotom.example_arch_viewmodel.databinding.FragmentExampleFormBinding; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProviders; public class FormValidationFragment extends Fragment implements FormValidationView { private FragmentExampleFormBinding mBinding; private FormValidationViewModel mViewModel; - public static FormValidationFragment newInstance() { Bundle args = new Bundle(); FormValidationFragment fragment = new FormValidationFragment(); @@ -25,14 +24,12 @@ public static FormValidationFragment newInstance() { return fragment; } - @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mViewModel = ViewModelProviders.of(this).get(FormValidationViewModel.class); } - @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -42,13 +39,11 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c return mBinding.getRoot(); } - @Override public void onSubmitClicked() { Toast.makeText(getContext(), "Submit clicked and form is valid!", Toast.LENGTH_LONG).show(); } - @Override public void onResetClicked() { mViewModel.email.reset(); diff --git a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/form/FormValidationView.java b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/form/FormValidationView.java index bf53031..92f86c8 100644 --- a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/form/FormValidationView.java +++ b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/form/FormValidationView.java @@ -1,6 +1,5 @@ package com.mlykotom.example_arch_viewmodel.form; - public interface FormValidationView { void onSubmitClicked(); void onResetClicked(); diff --git a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/form/FormValidationViewModel.java b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/form/FormValidationViewModel.java index ced0035..a18c4c5 100644 --- a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/form/FormValidationViewModel.java +++ b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/form/FormValidationViewModel.java @@ -1,27 +1,26 @@ package com.mlykotom.example_arch_viewmodel.form; -import androidx.lifecycle.ViewModel; - import com.mlykotom.valifi.ValiFiForm; import com.mlykotom.valifi.fields.ValiFieldEmail; import com.mlykotom.valifi.fields.ValiFieldPassword; import com.mlykotom.valifi.fields.ValiFieldPhone; +import androidx.lifecycle.ViewModel; public class FormValidationViewModel extends ViewModel { public final ValiFieldEmail email = new ValiFieldEmail(); public final ValiFieldPassword password = new ValiFieldPassword(); public final ValiFieldPassword password2 = new ValiFieldPassword(); public final ValiFieldPhone phone = new ValiFieldPhone(); - public final ValiFiForm form = new ValiFiForm(email, password, password2, phone); + public final ValiFiForm passwordForm = new ValiFiForm(password, password2); + public final ValiFiForm form = new ValiFiForm(email, passwordForm, phone); public FormValidationViewModel() { phone.setEmptyAllowed(true); password2.addVerifyFieldValidator("Passwords must be the same", password); } - @Override protected void onCleared() { form.destroy(); diff --git a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/manual/ManualValidationFragment.java b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/manual/ManualValidationFragment.java index 972164b..e7c79be 100644 --- a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/manual/ManualValidationFragment.java +++ b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/manual/ManualValidationFragment.java @@ -1,10 +1,6 @@ package com.mlykotom.example_arch_viewmodel.manual; -import androidx.lifecycle.ViewModelProviders; import android.os.Bundle; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -12,12 +8,15 @@ import com.mlykotom.example_arch_viewmodel.databinding.FragmentExampleManualBinding; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProviders; public class ManualValidationFragment extends Fragment implements ManualValidationView { private FragmentExampleManualBinding mBinding; private ManualValidationViewModel mViewModel; - public static ManualValidationFragment newInstance() { Bundle args = new Bundle(); @@ -27,14 +26,12 @@ public static ManualValidationFragment newInstance() { return fragment; } - @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mViewModel = ViewModelProviders.of(this).get(ManualValidationViewModel.class); } - @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -44,10 +41,9 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c return mBinding.getRoot(); } - @Override public void onManualSubmitClicked() { - if(mViewModel.onManualSubmit()) { + if (mViewModel.onManualSubmit()) { Toast.makeText(getContext(), "Form is valid!", Toast.LENGTH_LONG).show(); } } diff --git a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/manual/ManualValidationView.java b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/manual/ManualValidationView.java index 224f87f..e1ebcb9 100644 --- a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/manual/ManualValidationView.java +++ b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/manual/ManualValidationView.java @@ -1,6 +1,5 @@ package com.mlykotom.example_arch_viewmodel.manual; - public interface ManualValidationView { void onManualSubmitClicked(); } diff --git a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/manual/ManualValidationViewModel.java b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/manual/ManualValidationViewModel.java index 8bc9e8e..f1e8e8b 100644 --- a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/manual/ManualValidationViewModel.java +++ b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/manual/ManualValidationViewModel.java @@ -1,35 +1,31 @@ package com.mlykotom.example_arch_viewmodel.manual; -import androidx.lifecycle.ViewModel; - import com.mlykotom.example_arch_viewmodel.MyValiFieldCaptcha; import com.mlykotom.valifi.ValiFiErrorDelay; import com.mlykotom.valifi.ValiFiForm; import com.mlykotom.valifi.fields.ValiFieldEmail; +import androidx.lifecycle.ViewModel; public class ManualValidationViewModel extends ViewModel { public final ValiFieldEmail email = new ValiFieldEmail(); public final MyValiFieldCaptcha captcha = new MyValiFieldCaptcha(); public final ValiFiForm form = new ValiFiForm(email, captcha); - public ManualValidationViewModel() { email.setErrorDelay(ValiFiErrorDelay.NEVER); } - @Override protected void onCleared() { form.destroy(); super.onCleared(); } - public boolean onManualSubmit() { form.refreshError(); - if(form.isValid()) { + if (form.isValid()) { // do what you want after validation return true; } diff --git a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/single/SingleValidationFragment.java b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/single/SingleValidationFragment.java index 2ed61d5..281d182 100644 --- a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/single/SingleValidationFragment.java +++ b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/single/SingleValidationFragment.java @@ -1,10 +1,6 @@ package com.mlykotom.example_arch_viewmodel.single; -import androidx.lifecycle.ViewModelProviders; import android.os.Bundle; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -12,12 +8,15 @@ import com.mlykotom.example_arch_viewmodel.databinding.FragmentExampleSingleBinding; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProviders; public class SingleValidationFragment extends Fragment implements SingleValidationView { private FragmentExampleSingleBinding mBinding; private SingleValidationViewModel mViewModel; - public static SingleValidationFragment newInstance() { Bundle args = new Bundle(); @@ -27,14 +26,12 @@ public static SingleValidationFragment newInstance() { return fragment; } - @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mViewModel = ViewModelProviders.of(this).get(SingleValidationViewModel.class); } - @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -44,13 +41,11 @@ public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup c return mBinding.getRoot(); } - @Override public void onSubmitClicked() { Toast.makeText(getContext(), "Submit clicked and got " + mViewModel.username.getValue(), Toast.LENGTH_LONG).show(); } - @Override public void onExternalErrorClick() { mViewModel.username.setError("This is external error"); diff --git a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/single/SingleValidationViewModel.java b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/single/SingleValidationViewModel.java index fe62eb9..1d97366 100644 --- a/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/single/SingleValidationViewModel.java +++ b/example-arch-viewmodel/src/main/java/com/mlykotom/example_arch_viewmodel/single/SingleValidationViewModel.java @@ -1,9 +1,5 @@ package com.mlykotom.example_arch_viewmodel.single; -import androidx.lifecycle.ViewModel; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - import com.mlykotom.valifi.ValiFi; import com.mlykotom.valifi.ValiFiValidable; import com.mlykotom.valifi.ValiFieldBase; @@ -14,7 +10,11 @@ import java.util.Arrays; import java.util.List; +import java.util.Locale; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModel; public class SingleValidationViewModel extends ViewModel { public final ValiFieldUsername username = new ValiFieldUsername(); @@ -24,20 +24,17 @@ public class SingleValidationViewModel extends ViewModel { public final ValiFiValidable validable = username; - public SingleValidationViewModel() { setupNumberValidator(); setupAsyncUsernameValidator(); } - @Override protected void onCleared() { ValiFi.destroyFields(numLong, username, async, creditCard); super.onCleared(); } - /** * Example of initialization number validator. */ @@ -51,7 +48,6 @@ public boolean isValid(@NonNull Long value) { }); } - /** * Initialization of asynchronous validation of username */ @@ -61,7 +57,7 @@ private void setupAsyncUsernameValidator() { public boolean isValid(@Nullable String value) throws InterruptedException { Thread.sleep(2000); List registeredUsernames = Arrays.asList("user", "name", "mlyko", "mlykotom", "charlie"); - return value != null && !registeredUsernames.contains(value.trim().toLowerCase()); + return value != null && !registeredUsernames.contains(value.trim().toLowerCase(Locale.US)); } }); } diff --git a/example-arch-viewmodel/src/main/res/drawable-v24/ic_launcher_foreground.xml b/example-arch-viewmodel/src/main/res/drawable-v24/ic_launcher_foreground.xml index 5a9ebba..4ec1b50 100644 --- a/example-arch-viewmodel/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ b/example-arch-viewmodel/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -2,13 +2,13 @@ xmlns:aapt="http://schemas.android.com/aapt" android:width="108dp" android:height="108dp" - android:viewportHeight="108" - android:viewportWidth="108"> + android:viewportWidth="108" + android:viewportHeight="108"> + android:strokeWidth="1" + android:strokeColor="#00000000"> + android:color="#44000000" android:offset="0.0" /> + android:color="#00000000" android:offset="1.0" /> @@ -29,6 +27,6 @@ android:fillColor="#FFFFFF" android:fillType="nonZero" android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z" - android:strokeColor="#00000000" - android:strokeWidth="1" /> + android:strokeWidth="1" + android:strokeColor="#00000000" /> diff --git a/example-arch-viewmodel/src/main/res/drawable/ic_launcher_background.xml b/example-arch-viewmodel/src/main/res/drawable/ic_launcher_background.xml index 918e893..348859b 100644 --- a/example-arch-viewmodel/src/main/res/drawable/ic_launcher_background.xml +++ b/example-arch-viewmodel/src/main/res/drawable/ic_launcher_background.xml @@ -1,107 +1,169 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:viewportWidth="108" + android:viewportHeight="108"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example-arch-viewmodel/src/main/res/layout/activity_example.xml b/example-arch-viewmodel/src/main/res/layout/activity_example.xml index 42d10d8..12e0070 100644 --- a/example-arch-viewmodel/src/main/res/layout/activity_example.xml +++ b/example-arch-viewmodel/src/main/res/layout/activity_example.xml @@ -1,5 +1,4 @@ - @@ -21,14 +20,14 @@ android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" - app:tabMode="fixed" - app:tabGravity="fill" /> + app:tabGravity="fill" + app:tabMode="fixed" /> \ No newline at end of file diff --git a/example-arch-viewmodel/src/main/res/layout/fragment_example_form.xml b/example-arch-viewmodel/src/main/res/layout/fragment_example_form.xml index f79d7d5..b54a273 100644 --- a/example-arch-viewmodel/src/main/res/layout/fragment_example_form.xml +++ b/example-arch-viewmodel/src/main/res/layout/fragment_example_form.xml @@ -1,6 +1,5 @@ - @@ -27,61 +26,88 @@ + app:error="@{viewModel.email.error}" + app:errorEnabled="true"> + android:text="@={viewModel.email.value}" /> + + + + app:passwordToggleEnabled="true"> + android:text="@={viewModel.password.value}" /> + + + + app:passwordToggleEnabled="true"> + android:text="@={viewModel.password2.value}" /> + + + + + app:error="@{viewModel.phone.error}" + app:errorEnabled="true"> + android:text="@={viewModel.phone.value}" /> + +