【问题标题】:Using Strings from resource "R.String" on layer presenter MVP在图层演示者 MVP 上使用资源“R.String”中的字符串
【发布时间】:2017-02-21 22:50:20
【问题描述】:

在 MVP 模式中,我的字符串具有动态值 %

例子:

<string name="hello">%s hello</string>

我需要在我的 textview 上用“我的名字”设置这个文本,我将如何在没有引用的情况下在我的演示者层上直接使用 R.String。

public void onItemClicked(String name) {
        if (mainView != null) {
             //HOW use R.string.hello from Strings  here? [presenter layer]
            mainView.showMessage(String.format("%s hello", name));
        }
    }

在 MVP 模式中,我无法在演示者层中引用任何 Android 类,我在此类中没有任何上下文,但我需要使用 R.string.hello,因为翻译,我怎么能接受这个破坏这个 MVP 模式

【问题讨论】:

    标签: android mvp presenter


    【解决方案1】:

    快速回答:你没有

    你构造你的代码,所以你的视图方法是:

    @Override
    public void showMessage(String name){
    
        if (mTextView != null){
            mTextView.setText(String.format(getString(R.string.hello), name));
        }
    }
    

    那么你的演示者代码是:

    public void onItemClicked(String name) {
        if (mainView != null) {
            mainView.showMessage(name);
        }
    }
    

    MVP 都是关于干净的可测试代码,在这种情况下,您想要在演示者中进行测试的只是演示者将正确的名称传递给视图。您不需要测试String.format() 或从资源中获取字符串(其他开发人员已经这样做了,即Android 开发人员)。我建议也许更深入地了解为什么 MVP 将使您的项目受益

    【讨论】:

    • 谢谢这么多,使用该逻辑不能在我的演示者中使用类似 showmessage( getview(R.id.text) , text) 因为有一个 R 类,对吧?
    • 我从未尝试过这种方法,但它可能有效,但我不建议这样做。再次进行单元测试时,您的单元测试不会了解该 R 类
    【解决方案2】:

    getString() 有一个重载版本,它采用可变参数进行格式化。

    【讨论】:

    • 在 MVP 模式上,我无法在演示者层中引用 Android 类,我在此类中没有任何上下文,但我需要使用 R.string.hello,因为翻译,我怎么能接受这个没有破坏这个 MVP 模式
    • @rcorbellini 您必须有上下文才能加载字符串资源。一种可能性是将其加载到其他地方并传递给演示者。或者,创建演示者可以调用的包装类。然后这个包装器委托给一个上下文。
    • 我知道我需要一个上下文来从资源中获取字符串,但是有哪些选项?创建一个类“StringsHelper [with access to context]”并在构造时发送给演示者?但这是一种间接依赖(不是吗?)我可以在不破坏这种模式的情况下使用它吗?
    • @rcorbellini 我在之前的评论中提出了两个建议。
    猜你喜欢
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    相关资源
    最近更新 更多