How to get R.string in ViewModel DataBinding class in Android

I am currently using databinding for my Android app project. I want to set the error message on my CustomTextView from R.string.txtOldPassWordError and set it from another class called ViewModelClass .

Here is my xml code

 <com.horseproject.widget.CustomEditText android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginTop="@dimen/dp_20" android:drawablePadding="@dimen/dp_10" android:hint="@string/enter_old_password" android:inputType="textPassword" android:lines="1" android:text="@={ChangePasswordVM.userOldPassword}" android:textColorHint="@color/gray_text" app:drawableLeftCompat="@drawable/ic_password_lock" app:drawableTintCompat="@color/gray_app" app:error="@{ChangePasswordVM.userOldPasswordError}" /> 

and this is ViewModelClass.java

 public class ChangePasswordViewModel extends BaseObservable { public ObservableField<String> userOldPassword = new ObservableField<>(""); public void userPasswordChange() { if ((TextUtils.isEmpty(userOldPassword.get()))) { userOldPasswordError.set("Please enter your old password"); return; } else if (userOldPassword.get().length() <= 5) { userOldPasswordError.set("Password should contain minimum 6 characters"); return; } else { userOldPasswordError.set(null); } } } 

and this is the string from strings.xml

 <string name="select">Please Enter Old Password</string> 

So, I want to access this line in my viewModel class and set it as an error message instead of hardcoded it directly as string .

So how can I achieve this? I am using beta version of Android Studio 3.0. Any help would be really appreciated.

+6
source share
3 answers

Create ResourceProvider Class

 public class ResourceProvider { private Context mContext; public ResourceProvider(Context mContext) { this.mContext = mContext; } public String getString(int resId) { return mContext.getString(resId); } public String getString(int resId, String value) { return mContext.getString(resId, value); } } 

go to ApplicationClass and paste

 public class YourAppName extends Application { // Resource Provider private ResourceProvider mResourceProvider; public ResourceProvider getResourceProvider() { if (mResourceProvider == null) mResourceProvider = new ResourceProvider(this); return mResourceProvider; } } 

now go to ChangePasswordViewModel and create a ResourceProvider object

 private ResourceProvider mResourceProvider; 

and pass it to constroctor ChangePasswordViewModel

how can you get to it

  userOldPasswordError.set(mResourceProvider.getString(R.string.select)); 
+5
source

Using ObservableInt worked for me. Adding this to the ViewModel

 private final ObservableInt mErrorText = new ObservableInt(R.string.empty_text); public ObservableInt getErrorText() { return mErrorText; } 

And just setting a new String value

 mErrorText.set(R.string.text_not_valid); 

In XML, add the following to a TextView

 android:text="@{viewModel.errorText}" 
+8
source

You can send the context to the layout as follows:

XML:

 <!-- <data> <variable name="observable" type="...MyBaseObservableClass" /> </data> --> android:text="@{observable.getDescription(context)}" 

MyBaseObservableClass.kt:

 @Bindable fun getDescription(context: Context): String { return context.getString(R.string.my_string) } fun setNewData(data: Object) { this.data = data notifyPropertyChanged(BR.description) } 
0
source

Source: https://habr.com/ru/post/1272499/


All Articles