将字符串资源从交互器传递到android MVP

时间:2017-10-26 04:52:49

标签: java android android-resources android-mvp

所以,我目前正在尝试在Android中实现MVP方法,我是新手。现在,它指出,演示者和交互者类都不应该掌握有关android类或组件的知识。

将业务逻辑与框架分离是有意义的。 好到目前为止。

但是我有一个演示者实现了一个回调登录交互器,它传递一个字符串资源id。演示者将字符串res id传递给以某种形式显示错误消息的视图(无论是吐司还是对话框)。

交互器:

public interface SignInteractor {

void login(String email, String password, OnLoginListener loginListener);

interface OnLoginListener {

    void onLoginSuccess();

    void onLoginFail(int error);

   } 
}

主讲人:

public interface SignInPresenterImpl {
private SignInteractorImpl mInteractor; // interactor implementation
private SignInView mSignInView; // view reference

// additional code 

    void login(String email, String password){

        mInteractor.login(email,password, new SignInteractor.OnLoginListener(){

        @Override
        public void onLoginSuccess() {
            if (mSignInView != null) {
                mSignInView.signInSuccess();
            }
        }

        @Override
        public void onLoginFail(final int error) {
            if (mSignInView != null) {
                mSignInView.showError(R.string.error);
            }
        }
        })
    }

}

活动视图:

SignInViewActivity implements SignInView{
   // additional code

   void showError(int resId){
    Toast.makeText(this, getString(resId), Toast.LENGTH_SHORT).show();
   }
}

然而,由于R文件是android框架的一部分,这使得演示者和交互器不能在纯Java应用程序中使用。

我在各种论坛上经历了很多文章和讨论,提供了各种方法来实现这一目标。

解决方案:

  1. 视图应该使用showLoginError()之类的方法,并决定自己如何处理视图逻辑。通过这种方式,演示者不知道与Android相关的东西。

    • 但是,无法从交互器进行字符串操作。
  2. 在视图中创建处理所有情况的特定方法,例如showinvalidEmail(),showinvalidPassword()等。

    • 方法太多,在复杂情况下很难。
  3. 将枚举用于错误类型并传递给视图.showError(ErrorTypes.INVALID_EMAIL) - 仍然对#enumsmatter感到困惑:)

  4. https://www.reddit.com/r/androiddev/comments/4v4urs/mvp_question_how_do_you_populate_your_textviews/

    1. 使用提供所需字符串的资源抽象或包装类。
      • 在有大量字符串使用时很难。
    2. https://medium.com/@daptronic/android-mvp-the-curious-case-of-resources-ddca39c1fccd

      1. 使用为strings.xml中的每个字符串提供api实现的库
        • 仍处于测试阶段
      2. https://github.com/Comcast/resourceprovider

        请建议达到此目的的最佳方法是不违反mvp或干净架构的原则。

3 个答案:

答案 0 :(得分:0)

正如您现在已经登录失败时要显示哪个错误所以您只需要从showError声明中删除参数并尝试从没有任何参数和视图的演示者调用该方法将处理哪条消息当showError函数调用如下时显示:

查看

void showError(){
    Toast.makeText(this, getString(R.string.error), Toast.LENGTH_SHORT).show();
}

演示

mSignInView.showError();

还定义了另一种方法来显示响应中的错误,如下所示:

查看

void showError(String error){
    Toast.makeText(this, error, Toast.LENGTH_SHORT).show();
}

演示

mSignInView.showError(error);

答案 1 :(得分:0)

根据我的理解,MVP不是要从你的业务逻辑中删除android类,而是关于分离逻辑和UI部分,以及从交互器访问android类或资源不是一个错误。

但是如果你想完全分离,即所有的android资源或类来自交互器,那么提供类型并从UI中读取它。

SignInViewActivity implements SignInView{
// additional code

    void showError(int errorType){
         switch(errorType){
             case ....:
         }
         //display message
    }
}

答案 2 :(得分:0)

您可以创建

之类的枚举类
 enum class AuthError {
        INPUT_EMAIL_INVALID,
        INPUT_PASSWORD_INVALID,
        RESPONSE_EMAIL_DOES_NOT_EXIST
 }

然后您可以将其传递给这样的视图

AuthView.someError(AuthError.INPUT_EMAIL_INVALID)

您可以从那里检查AuthError的类型来检查错误的类型,然后可以致电R.string.error_message

这将删除具有Android特定代码的Presenter。