2010-06-28 51 views
1

我有一個類似的查詢以發佈here。我創建了一個由可變數量的按鈕組成的網格,在運行時(在TableLayout中),並希望找到按下按鈕的索引。實際的Button對象當前存儲在一個數組中,但我不確定這是否真的有必要。我試着用ClickListener寫一些東西:在Android中獲取以編程方式生成的按鈕網格的編號

public void onClick(View view) { 

     Button clickedButton = (Button) view; 
       int buttonID = clickedButton.getId(); 

但是這只是總是返回-1。沒有預先定義xml中的按鈕,是否有可能獲得id(或按下其他按鈕的引用)?

另一篇文章中的解決方案描述了循環遍歷整個按鈕數組和比較id。有沒有更優雅的方式來做到這一點?

回答

1

您可以通過this method手動爲動態創建的小部件設置ID。

+0

謝謝,這正是我正在尋找的。 – Hemmer 2010-06-28 15:26:44

0

鑑於您有參考資料,您不需要id。

final Button b1 = new Button(this); 
    final Button b2 = new Button(this); 
    final Button b3 = new Button(this); 
    Button[] buttons = new Button[] { b1, b2, b3 }; 
    OnClickListener listener = new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (v == b1) { 
       // TODO 
      } else if (v == b2) { 
       // TODO 
      } else if (v == b3) { 
       // TODO 
      } 
     } 
    }; 
    for (Button b : buttons) { 
     b.setOnClickListener(listener); 
    } 
+0

因此,對於一個大網格(說10x10),你只需要使用for循環,並通過檢查參考循環?我是否應該擔心這種性能受到影響?謝謝你的幫助。 – Hemmer 2010-06-28 14:23:19

+0

這種檢查應該非常快。 – yanchenko 2010-06-28 14:44:53

0

如果有人需要這個,我更喜歡這樣做。監聽器也是一個類,所以你可以爲它創建實例變量。

new Listener(id) { 

    private int id; 

    public Listener(int id) { 
    this.id = id; 
    } 

    private void onClick(View view) {   
    buttonID = id; 
    } 

} 

其中,buttID在偵聽器之外聲明。通過將類外部的偵聽器作爲單獨的類移動以避免內存泄漏,可以改進此解決方案。

處理無泄漏偵聽器的另一種方法是將偵聽器定義爲嵌套類,方法是在包含類中聲明public/private static class Listener,但這會導致在此情況下每次都會覆蓋int id

相關問題