2012-03-19 58 views
3

我創建不同的按鈕,動態是這樣的:setOnClickListener動態

for (int toShow = 1; toShow <= nShips; toShow++) 
    { 
     btn = new Button(this); 
     btn.setBackgroundResource(shipDrawable.get(ima)); 
     btn.setLayoutParams(params); 
     row[pos].addView(btn); 
     btn.setId(shipId.get(ima)); 
     if (row[pos].getChildCount() == 3) pos++; 
     ima++; 
    } 

我需要知道每個按鈕的身份,因爲彼此有不同的動作。然後,我嘗試像這樣設置onClickListener

btn.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View btn) { 
      switch(btn.getId()){ 
       case 1000: System.out.println("FIRST"); 
       break; 

       case 1004: System.out.println("FOURTH"); 
       break; 
      } 
     } 
    }); 

但它不起作用。看起來onClickListener隻影響最後創建的項目。如果我創建四個按鈕,只有第四個按鈕有onClickListener

如何讓我的點擊偵聽器正常工作?

回答

3

你可以這樣做:

OnClickListener listener = new OnClickListener() { 
      @Override 
      public void onClick(View btn) { 
       switch(btn.getId()){ 
        case 1000: System.out.println("FIRST"); 
        break; 

        case 1004: System.out.println("FOURTH"); 
        break; 
       } 
      } 
     }; 

for (int toShow = 1; toShow <= nShips; toShow++) { 
     btn = new Button(this); 

     // Set the click listener to all your buttons 
     btn.setOnClickListener(listener); 

     btn.setBackgroundResource(shipDrawable.get(ima)); 
     btn.setLayoutParams(params); 
     row[pos].addView(btn); 
     btn.setId(shipId.get(ima)); 
     if (row[pos].getChildCount() == 3) pos++; 
     ima++; 
    } 

乾杯,
Yuvi

+0

這個回覆與Hiral的回覆非常相似。他首先發布,因此「接受的答案」會發給他。對不起 – 2012-03-19 11:37:06

+0

@KrLx_roller很好。雖然我只是看着帖子的時間,而且我確實在他之前發佈了答案。但是無論如何,我很高興你解決了你的問題。 – YuviDroid 2012-03-19 12:43:19

4

for循環結束後,btn指的是最後一個創建的按鈕,不是所有的按鈕。每次您執行btn = new Button(...)時,都會丟失btn的先前值。

由於您在for循環之外設置了點擊偵聽器,因此只有最後一個按鈕纔會獲取該處理程序。要使所有按鈕都能正常工作,您需要在的for循環內設置聽衆

在這種情況下,不是將switch放在一個函數中,而是將所有對象的偵聽器設置爲該函數,通常會創建一個通用函數,並將每個對象的點擊偵聽器設置爲該函數旁邊的委託通用函數的額外參數來確定應該完成的工作。

+0

謝謝你的解釋。我想我的錯誤是那個,但我不確定。 – 2012-03-19 11:38:02

0
    for (Answer a : q.getAnswers()) { 
         final CheckBox cb = new CheckBox(this); 
         cb.setId(Integer.valueOf(a.getId())); 
         cb.setText(a.getValue()); 
         cb.setTextColor(fontColor); 
         cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

          @Override 
          public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
           // TODO Auto-generated method stub 
           if(isChecked){ 
            inviCheckox.append("-"+String.valueOf(buttonView.getId())); 
           } 

         }); 
         lCheckList.addView(cb); 
        } 

我試圖用這樣的代碼,它的工作(API呂10)。

我可以初始化新View迴路(最終)的內部,只需要添加新的監聽器,它

5

你可以這樣做:

OnClickListener clicks=new OnClickListener() { 

    @Override 
    public void onClick(View v) { 

      switch(v.getId()) 
      { 
       case 1000: System.out.println("FIRST"); 
       break; 

       case 1004: System.out.println("FOURTH"); 
       break; 
      }  
    } 
}; 
for (int toShow = 1; toShow <= nShips; toShow++) 
{ 
     btn = new Button(this); 
     btn.setBackgroundResource(shipDrawable.get(ima)); 
     btn.setLayoutParams(params); 
     row[pos].addView(btn); 
     btn.setId(shipId.get(ima)); 
     btn.setOnClickListener(clicks); 
     if (row[pos].getChildCount() == 3) pos++; 
     ima++; 
} 
+0

謝謝!它像一個魅力工作! – 2012-03-19 11:35:42

+0

@KrLx_roller:很高興提供幫助。 :) – Hiral 2012-03-19 12:24:00