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

4

我有一个显示游戏所有关卡的视图。这些关卡由活动读取,然后传递到视图中。虽然我可以从视图中读取它们,但这不是它的职责,而我喜欢分离关注点。

目前,我正在调用一个setter来实现:

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

然而,如果我忘记调用setter函数,这个视图将无法正常工作,这一点让我不太满意。是否有更好的方法来传递等级?

3个回答

2
这也有一些偏好的成分。从理论上讲,按照您目前的方式通过各个级别是完全可以的。另外,如果您需要更多功能(例如保存级别等),我通常会使用一个单独的类来处理此类事情(例如存储库、某个“管理器”类等)。然后将该类传递到视图构造函数中,最好是强制性地提供它。当然,为了分离功能,我使用接口而不是特定的实现,以便看起来如下所示:
public class MyView {

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

   ...
}

通常情况下,这可能行不通,因为视图是由框架直接实例化而不是应用程序。在这种情况下,你被迫通过适当的Setter进行操作。这是某种MVC / MVP模式。
只是为了让你感兴趣,您可能还想看看IoC容器和依赖注入。Google提供的Guice是一个不错的框架,我已经在Android上使用过。

我看了Guice,但没有发现我想做的事情。我错过了什么吗? - futlib
没有Guice和依赖注入只是与您提到喜欢“关注点分离”有关 :)。依赖注入是一个太广泛的主题,不能在此评论中提及,只需在网络上寻找即可。这是一种良好的编码实践,可以创建松散耦合的组件。 - Juri

0
我希望没有误解,以下是内容: 通常您可以有一个设置某些东西的函数(例如文本视图的文本),或者您在 XML 中设置的属性。
看一下我在问题上得到的答案:如何在屏幕中央布局图像网格 自定义视图需要一些东西,但是让我们以“numColumns”为例。
- 您可以使用setNumColumns来设置它(这将相当于您的loadLevels()?) - 您可以忽略它,它会恢复默认值。 - 您可以将其设置为属性,如:app:numColumns="3" 您可以尝试使用属性或类中的默认值来完成此操作。

那么当我在视图中添加一个setter时,我可以在XML中使用app:propertyName来调用它吗?这很好,但我无法想象如何在其中传递一系列级别。 - futlib

0
将您的视图设置为一个抽象类,并添加一个抽象方法getLevels()。这样,当您实例化该类时,如果在代码中忘记传递级别,则无法编译。是否更好,我想这是个人口味问题 :)

我认为这不会起作用,因为我的视图实际上是由Android SDK实例化的 - 我是在XML布局文件中添加它的。 - futlib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接