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

7 data-binding android textview

我目前正在使用databinding我的Android应用程序项目.我想error在我的CustomTextViewfrom 上设置消息,R.string.txtOldPassWordError并从另一个叫做的类中设置它ViewModelClass.

这是我的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}" />
Run Code Online (Sandbox Code Playgroud)

这是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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是来自的字符串 strings.xml

<string name="select">Please Enter Old Password</string>
Run Code Online (Sandbox Code Playgroud)

所以,我想在我的viewModel类中访问此字符串并将其设置为错误消息而不是hardcoded it directly as string.

那我该怎么做呢?我使用的是Android Studio 3.0 Beta版.任何帮助将非常感激.

lat*_*son 9

使用ObservableInt为我工作.将其添加到ViewModel

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

public ObservableInt getErrorText() {
   return mErrorText;
}
Run Code Online (Sandbox Code Playgroud)

只需设置一个新的String值

mErrorText.set(R.string.text_not_valid);
Run Code Online (Sandbox Code Playgroud)

在xml中将以下内容添加到TextView中

android:text="@{viewModel.errorText}"
Run Code Online (Sandbox Code Playgroud)


Rav*_*iya 6

建立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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在转到您的ApplicationClass粘贴

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

        return mResourceProvider;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在转到您的目录ChangePasswordViewModel并创建ResourceProvider的对象

private ResourceProvider mResourceProvider;
Run Code Online (Sandbox Code Playgroud)

并通过它constroctorChangePasswordViewModel

比您可以访问的

 userOldPasswordError.set(mResourceProvider.getString(R.string.select));
Run Code Online (Sandbox Code Playgroud)

  • 我听说将Context的实例传递给ViewModel类不是一个好方法。 (8认同)