2011-02-06 73 views
4

我有一個視圖,顯示我的遊戲的所有級別。這些級別由活動讀取,然後傳遞到視圖中。我可以從視圖中閱讀它們,但這不是它的真正責任,而且我是分散關注的粉絲。Android:如何最好地將數據傳遞給視圖?

現在,我打電話二傳手這個:

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

不過,我不喜歡的事實,認爲將是不正常的,如果我忘了打電話給二傳手。有沒有更好的方法來通過關卡?

回答

2

這也有點偏好的問題。理論上,通過關卡是完全正確的。或者,如果您不僅僅需要設置關卡級別,而是提供更多功能(即同時節省關卡),我通常會使用負責處理此類事務的單獨類(即存儲庫,某些「經理」類等)。然後這個類被傳入構造函數的視圖中,最好是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

0

我希望我沒有錯過這一點,但這裏有: 通常,您可以設置某個功能(如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

0

用抽象方法使您的視圖成爲抽象類getLevels()?這樣,如果您忘記在代碼中傳遞級別,則實例化類時將無法編譯。

不管這是更好的是一個品味的問題我想:)

+0

我不認爲這會起作用,因爲我的視圖實際上是由Android SDK實例化的 - 我將它添加到XML佈局文件中。 – futlib 2011-02-06 17:00:00

相關問題