Android:如何最好地将数据传递给视图?

问题描述:

我有一个视图,显示我的游戏的所有级别。这些级别由活动读取,然后传递到视图中。我可以从视图中阅读它们,但这不是它的真正责任,而且我是分散关注的粉丝。Android:如何最好地将数据传递给视图?

现在,我打电话二传手这个:

((GameView) findViewById(R.id.game)).setLevels(loadLevels()); 

不过,我不喜欢的事实,认为将是不正常的,如果我忘了打电话给二传手。有没有更好的方法来通过关卡?

这也有点偏好的问题。理论上,通过关卡是完全正确的。或者,如果您不仅仅需要设置关卡级别,而是提供更多功能(即同时节省关卡),我通常会使用负责处理此类事务的单独类(即存储库,某些“经理”类等)。然后这个类被传入构造函数的视图中,最好是s.t.一个人*提供。当然,为了分离事物,我使用接口而不是特定的实现s.t.那么它可能看起来如下:

public class MyView { 

    public MyView(ILevelLoader levelLoader){ 
     this.levelLoader = levelLoader; 
    } 

    ... 
} 

通常情况下,这可能无法工作,因为视图是由东西的框架,而不是直接由应用程序实例化。在这种情况下,你不得不通过适当的制定者来完成。这是某种MVC/MVP模式。

只是为了您的兴趣,您可能还想看看IoC containers和依赖注入。 Google提供的Guice是我已经在Android上使用的一个很好的框架。

+0

我看过Guice,但没有发现我想要做的事。我错过了什么? – futlib 2011-02-06 17:18:53

我希望我没有错过这一点,但这里有: 通常,您可以设置某个功能(如textview的文本)或设置在xml中的属性。

看看在这个回答我一个问题了:How to layout a 'grid' of images in the center of the screen

有一些事情的自定义视图的需要,但让举一个例子:“为numColumns”。

  • 您可以使用setNumColumns设置(这将是你的loadLevels相当于()?)
  • 你可以忽略它,它会恢复到默认值。
  • 可以将其设置为一个属性LIK这样:app:numColumns="3"

你可以尝试使用属性或默认的类来实现这一点。

+0

所以,当我添加一个setter到我的视图,我可以用app:propertyName在XML中调用它?这很好,但我无法想象如何通过一系列的关卡。 – futlib 2011-02-06 17:18:26

用抽象方法使您的视图成为抽象类getLevels()?这样,如果您忘记在代码中传递级别,则实例化类时将无法编译。

不管这是更好的是一个品味的问题我想:)

+0

我不认为这会起作用,因为我的视图实际上是由Android SDK实例化的 - 我将它添加到XML布局文件中。 – futlib 2011-02-06 17:00:00