Android MVP - 将字符串资源从演示者传递到视图

时间:2016-11-02 19:39:06

标签: android architecture android-resources mvp

我最近开始开发一款带有模型 - 视图 - 展示器架构的Android应用。我不能找到一个好的解决方案的一个问题就是从演示者传递字符串以在视图中显示。

我正在尝试将Android系统依赖关系排除在演示者层之外,以便更轻松地进行单元测试。提供来自服务器或其他外部源的字符串时,这很简单。当我需要显示一个总是相同的简单错误消息时,我可以使用像showWhateverError()这样的方法,其中视图已经知道要使用哪个字符串资源并且可以处理加载资源本身。当我有业务逻辑确定提供视图的字符串资源时,我可以在演示者中引用字符串资源ID(虽然这也感觉不对)。

我还没有找到一个好的解决方案的情况是,我需要显示一个有时来自服务器的字符串,有时候是基于某些业务逻辑的字符串资源。任何想法都会有所帮助!

2 个答案:

答案 0 :(得分:2)

对于这些情况,我有一个额外的助手类,我称之为Formatter。我将当前状态从Presenter传递给View,然后根据该状态向Formatter询问相应的字符串。我想一个小例子会有所帮助:

您有一个对象,表示您希望在视图上设置的数据。我们暂时将其称为State

public class State {

    private final boolean isServerString;
    private final String serverString;

    public State(boolean isServerString, String serverString) {
        this.isServerString = isServerString;
        this.serverString = serverString;
    }

    public boolean isServerString() {
        return isServerString;
    }

    public String getServerString() {
        return serverString;
    }
}

在你Presenter中,你会根据你需要的逻辑创建它并将其传递给View

public class MessagePresenter {

    private void setMessage() {

        // logic here

        State state = new State(true, "Hello from the server");
        view().setMessage(state);
    }
}

然后在你的Activity / Fragment / ViewGroup中,你有以下几点:

public class MyActivity extends Activity implements MessageView {

    private MessageFormatter formatter;
    private TextView messageTextView;

    @Override
    public setMessage(State state) {

        String message = formatter.getMessage(state);
        messageTextView.setText(message);
    }
}

正如您所见,视图要求Formatter在TextView中显示String。 Formatter看起来像这样:

public class MessageFormatter {

    private Context context;

    public MessageFormatter(Context context) {
        this.context = context;
    }

    public String getMessage(State state) {

        return state.isServerString()
                ? state.getServerString()
                : context.getString(R.string.default_message);
    }
}

它需要Context作为构造函数参数,是的,它确实有一点逻辑。然而,繁重的逻辑仍然存在于Presenter中。大多数情况下它应该只是一个简单的布尔检查。

当您创建Formatter界面,然后使用Presenter决定 Formatter进行实例化时,使用此方法的真正威力就会发挥作用。例如,您可以创建HoliidayMessageFormatterDefaultMessageFormatter,这样您就可以根据Presenter中的小逻辑检查为应用提供不同的主题。

答案 1 :(得分:1)

必须使用View!

处理错误消息可视化

您的演示者必须调用相关的错误方法,例如invalidEmail(),并且视图必须决定如何与用户交互并使用UI元素来显示错误。

在某些实现中,您可能希望显示动画而不是消息!因此,从下层发送消息到视图是不对的。

这是一个样本回购,可以帮助您更多地了解MVP,Dagger,测试和其他概念:

  

http://github.com/mmirhoseini/marvel

我希望它有所帮助:)