Android MVP - 应避免在演示者中使用R.string引用吗?

Sco*_*itt 29 testing mvp android presenter

为了完全将Android SDK与我的演示者类分离,我试图找出避免访问我们通常使用R的资源ID的最佳方法.我以为我可以创建一个接口来访问字符串资源之类的东西,但我仍然需要ID来引用字符串.如果我要做的事......

public class Presenter {
    private MyView view = ...;
    private MyResources resources = ...;

    public void initializeView() {
        view.setLabel(resources.getString(LABEL_RES_ID);
    }
}
Run Code Online (Sandbox Code Playgroud)

我仍然需要LABEL_RES_ID,然后将其映射到R.string.label我的资源桥.这很酷,因为我可以在用其他东西进行单元测试时将其换掉,但我不想管理另一个到字符串值的映射.

如果我放弃并只使用R.string值,我的演示者将再次绑定到我的视图.那不理想?是否有一个更容易的解决方案,人们用来解决这个问题,以使他们远离主持人.我不想以超出Android提供的方式管理字符串,因为我仍然希望将它们放在布局文件中并获得国际化等的好处.我想做一个可以与这个演示者一起工作的哑单元测试无需Android SDK即可生成R.java文件.这要问太多了吗?

PaN*_*TEC 21

我认为没有理由在Presenter中调用任何Android代码(但你总是可以这样做).

所以在你的情况下:

查看/活动onCreate()调用 - > presenter.onCreate();

Presenter onCreate()调用 - > view.setTextLabel()或视图中的任何内容.

始终将Android SDK与演示者分离.

在Github中,您可以找到一些关于MVP的示例:

  • 您的视图需要被动,并且您的Presenter处于活动状态,因此,演示者知道要呈现的内容,并且视图知道如何呈现它.如果您想在演示者的视图中显示错误,则需要进行如下调用:view.showContactLoadingError(); 并且您的视图可以根据视图的上下文设置消息.我用另一个我做的回购更新了样品. (21认同)
  • 你能指定一下`view.setTextLabel()`中的参数吗?因为如果你这样做,那就会回答这个问题.基本上想象一下,如果你的演示者中有逻辑显示消息`R.string.a`或`R.string.b`.如何传递此字符串以供视图显示? (8认同)

Sia*_*oli 6

最好不要在演示者中使用依赖于android sdk的上下文和所有对象.我发送String的id并将视图转换为字符串.喜欢这个 - >

getview().setTitle(R.string.hello);
Run Code Online (Sandbox Code Playgroud)

并在这样的视图上得到这个

@Override
public void setTitle(int id){
String text=context.getString(id);
//do what you want to do
}
Run Code Online (Sandbox Code Playgroud)

使用此方法,您可以在演示者中测试您的方法.它取决于R对象,但没关系.所有MVP类放在uncle bob clean架构的表示层中,这样你就可以使用像R类这样的android对象.但在域层中,您只能使用常规的Java对象

更新

对于那些想要在其他平台上重用其代码的人,可以使用包装类将id或enum类型映射到资源并获取字符串.

getView().setTitle(myStringTools.resolve(HELLO));
Run Code Online (Sandbox Code Playgroud)

字符串解析器方法是这样的,类可以由View和DI提供给演示者.

Public String resolve(int ourID){
return context.getString(resourceMap.getValue(ourID));
}
Run Code Online (Sandbox Code Playgroud)

但是在大多数情况下我不建议这样做,因为过度工程!在大多数情况下,你从不需要在其他平台上使用精确的表示代码,因此:更好的解决方案就是在其他平台上模拟R类,因为R类已经像包装器一样.你应该在其他平台上编写自己的R.