2017-10-10 11 views
4

J'utilise actuellement databinding pour mon projet d'application Android. Je souhaite définir le message error sur mon CustomTextView à partir de R.string.txtOldPassWordError et le configurer à partir d'une autre classe appelée ViewModelClass.Comment faire pour obtenir R.string dans ViewModel Classe de DataBinding dans Android

Voici mon 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}" /> 

et c'est 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); 
     } 
    } 
} 

et c'est une chaîne de strings.xml

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

Donc, je veux accéder à cette chaîne dans ma classe viewModel et la définir comme message d'erreur au lieu de hardcoded it directly as string.

Alors, comment puis-je y parvenir? J'utilise la version bêta d'Android Studio 3.0. Toute aide sera grandement appréciée.

+0

getResources() getString (R.string.select). ou renvoyer ce https://stackoverflow.com/questions/7493287/android-how-do-i-get-string-from-resources-using-its-name –

+0

J'ai essayé ce @SagarAghara, mais il est dit " ne peut pas résoudre la méthode 'getResources' ", merci pour les efforts –

+0

car getResources a besoin de contexte. Utilisez-vous l'architecture MVVM par hasard? Ne pourriez-vous pas passer la chaîne d'une activité ou d'un fragment via un constructeur? – Raghunandan

Répondre

2

Créer ResourceProvider classe

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

vont maintenant à votre ApplicationClass et collez

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

     return mResourceProvider; 
    } 
} 

aller maintenant à votre ChangePasswordViewModel et créer un objet de resourceProvider

private ResourceProvider mResourceProvider; 

et le transmettre à constroctor de ChangePasswordViewModel

que vous pouvez y accéder par

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