2012-02-14 53 views
1

目前,我有一個自定義視圖:安卓:如何通過額外的對象引用自定義視圖

public class MyView extends View { 

    public MyView(Context c, AttributeSet attrs) { 
    super(context, attrs); 

    } 
    .... 
    .... 
} 

現在,我想訪問未安卓相關的對象,說一個數據庫連接,怎麼辦我那樣做? 我目前的解決辦法是做到以下幾點

public class MyView extends View { 
    DBConnection connection; 

    public MyView(Context c, AttributeSet attrs) { 
    super(context, attrs); 

    } 
    .... 
    .... 
    public void setDBConnection(DBConnection c) 
     this.connection = c; 
    } 

    public void onDraw(Canvas canvas) { 
    this.connection.ensureUser(); 
    ... 
    .... 
    } 

我的問題是有沒有更好的方式來做到這一點?目前我需要設置(通過setter)來確保將要在MyView類中使用的對象被設置,上面的代碼片段可以工作,但我不知道這是否是優雅/流行的方法?我想通過構造函數傳遞對象,但我不能這樣做,因爲Android只調用MyView(Context c,AttributeSets attrs)構造函數,它不會調用版本如果我有MyView(上下文c,AttributeSets attrs,DBConnection db)一個。

請幫助

回答

1

當我遇到這樣的情況,我傾向於採取創建視圖後注入可顯示的數據的方法。所以,如果你的視圖需要顯示一串文本,你可以通過使用findViewBy id查找視圖,然後調用適當的setter來注入該字符串或者在創建活動期間從中提取字符串的對象。

至於「有沒有更好的方法來做到這一點,我會擔心傳遞一個dbconnection到一個視圖類,它不會通過」嗅覺「測試,好像你正在泄漏你的視圖的邏輯。對我來說,讓自己的觀點成爲一個光標或在Activity中填充一些對象會更有意義,這樣可以防止構建與特定用途/場景緊密結合的自定義視圖

On另一方面,你必須決定你希望視圖的可重用性如何,快速和骯髒的是這個特定項目的適當機智

+0

嗨,尼克,感謝您的回覆。只是一個例子你給我一個使用注射的例子嗎?我有點懷疑使用注射....我的意思是它可能有效,但我仍然認爲這不是唯一的方法,因爲注射,說Guice,是需要的東西。我不認爲這是不尋常的,你需要傳遞一些東西(無論是一個對象或只是一個簡單的字符串)到一個自定義視圖... – user1118019 2012-02-14 18:43:05

+0

對不起,我的意思是注射更一般。當你談論在構造函數中傳遞某些東西或使用setter時,它只是意味着視圖正在通過某人「插入」或「注入」它來獲取數據,而不是在內部查找其數據。考慮到這一點,如果您將List 傳遞給顯示這些字符串的視圖,那麼它沒有太多邏輯。相反,如果您傳遞數據庫連接,則視圖必須包含使用該數據庫連接來查找所需數據的代碼。通常,後者類型的內部代碼類型的可重用性較差。 – 2012-02-14 21:10:41

相關問題