2011-07-11 87 views
4

因此,我有一個屏幕,其中包含0到6個相同的用戶界面組件通過XML。類似這樣的東西:如何處理重複自定義組件的點擊/觸摸?

<TableRow android:layout_height="150px"> 

    <include android:id="@+id/p1" android:layout_width="fill_parent" 
     android:layout_height="wrap_content" layout="@layout/numerics_component" 
     android:onClick="onClick" /> 

</TableRow> 

<TableRow android:layout_height="150px"> 

    <include android:id="@+id/p2" android:layout_width="fill_parent" 
     android:layout_height="wrap_content" layout="@layout/numerics_component" 
     android:layout_below="@id/p1" android:onClick="onClick" /> 


</TableRow> 

...等

每個所包括UI的是幾個小部件,而且我重用自定義組件的集合。

我想檢測點擊在我的活動包括位中的組件,並適當地作出響應。問題是,在我的onClick方法,如果我共同遵循的模式,我永遠無法知道其中的觀點得到了點擊:

public void onClick(View view) { 

    Log.d(loggingName, "Got onClick event on view: " + view); 

    // Identify the view, and handle appropriately: 
    switch (view.getId()) { 

    ... 

與上面的代碼我永遠無法知道其成分的6份被點擊。必須有一個很好的方法來做到這一點,但我沒有看到它。

此外,我不想將可重用組件硬編碼到一個活動,因爲我想在應用程序的多個活動中重複使用它。所以理想情況下,我可以在我的Activity中設置監聽器。

關於如何做到這一點的任何想法?

謝謝!

回答

1

1)Android View類允許您通過setTag方法標記視圖的每個實例。

因此,只有setTag()對每個視圖有一些獨特的整數,甚至可能是一個對象與您將調用的方法。然後在您的點擊監聽器中,只需執行getTag()即可區分各種視圖實例。

2)您可以在每個視圖實例上放置一個唯一的onClickListener。

3)您可以對每個視圖實例執行findViewById(),並將它們存儲在成員變量,數組或其他某個數據結構中。然後在您的onClickListener中,您只需將傳遞至onClick()的視圖參考與您保存的參考列表進行比較。

+0

因此,基本上當我的Activity加載時,它需要循環遍歷6個可能的包含區域,並將setTag()中的每個組件都帶有ID?這似乎會起作用,但它的醜陋地獄。我會給它一個鏡頭並回報。謝謝! –

+0

您也可以在每個View實例上設置一個唯一的點擊處理程序。但這並不難看。由於某些我不知道的原因,View.getId()不能可靠地工作。 – mportuesisf

+0

增加了一個選項 - 將保存的對象引用與傳遞給onClick()的值進行比較。看到我編輯的答案。 – mportuesisf

1

您可以搜索層次結構來確定哪個子組件已被點擊。我發現表格的每一行都有唯一的ID。因此,即使佈局是用相同的ID重複的,視圖層次結構在任何子樹中都沒有相同的ID。

因此,要確定哪個子組件已被點擊,請獲取父視圖的ID(在您的情況下是一行)並查看視圖所屬的6行中的哪一行。那有意義嗎?