简体   繁体   English

如何在Android的ViewModel类DataBinding中获取R.string

[英]How to Get R.string in ViewModel Class of DataBinding in Android

I am currently using databinding for my android application project. 我目前正在为我的Android应用程序项目使用databinding I want to set the error message on my CustomTextView from R.string.txtOldPassWordError and set it up from another class called ViewModelClass . 我想从R.string.txtOldPassWordErrorCustomTextView上设置error消息,并从另一个名为ViewModelClass类中设置它。

Here is my XML code 这是我的XML代码

<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 这是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 string from strings.xml 这是来自strings.xml

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

So, I want to access this string in my viewModel class and set it as error message instead of hardcoded it directly as string . 所以,我想在我的viewModel类中访问此字符串并将其设置为错误消息,而不是hardcoded it directly as string将其hardcoded it directly as string

So how can i achieve this? 那我该怎么做呢? I am using Android Studio 3.0 Beta Version. 我使用的是Android Studio 3.0 Beta版。 Any help would be really appreciated. 任何帮助将非常感激。

Using an ObservableInt worked for me. 使用ObservableInt为我工作。 Adding this to the ViewModel 将其添加到ViewModel

private final ObservableInt mErrorText = new ObservableInt(R.string.empty_text);

public ObservableInt getErrorText() {
   return mErrorText;
}

And just setting a new String value 只需设置一个新的String值

mErrorText.set(R.string.text_not_valid);

In the xml add the following to the TextView 在xml中将以下内容添加到TextView中

android:text="@{viewModel.errorText}"

Create ResourceProvider class 创建ResourceProvider

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);
    }
}

now go to your ApplicationClass and paste 现在转到您的ApplicationClass并粘贴

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 your ChangePasswordViewModel and create object of ResourceProvider 现在转到ChangePasswordViewModel并创建ResourceProvider的对象

private ResourceProvider mResourceProvider;

and pass it in constroctor of ChangePasswordViewModel 并在ChangePasswordViewModel constroctor中传递它

than you can access it by 比你可以访问它

 userOldPasswordError.set(mResourceProvider.getString(R.string.select));

You can send context into the layout like this : 您可以将上下文发送到布局中,如下所示:

XML : XML:

<!-- 
<data>
     <variable 
          name="observable"
          type="...MyBaseObservableClass"
     />
</data>
 -->

android:text="@{observable.getDescription(context)}"

MyBaseObservableClass.kt : 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)
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM