2012-05-20 56 views
9

我通過動態代碼,而不是從XML創建的按鈕。
的代碼如下:
實施OnClickListener動態創建的按鈕的Android

dynamicview = (LinearLayout)findViewById(R.id.llayout); 
    LinearLayout.LayoutParams lprams = new LinearLayout.LayoutParams(
      LinearLayout.LayoutParams.WRAP_CONTENT, 
      LinearLayout.LayoutParams.WRAP_CONTENT); 

    for(int i=0;i<nob;i++){ 
     Button btn = new Button(this); 
     btn.setId(i+1); 
     btn.setText("Button"+(i+1)); 
     btn.setLayoutParams(lprams); 
     dynamicview.addView(btn); 
    } 


我沒有找到我在其中能實現OnClickListener到每個按鈕,這樣我可以根據參考我得到執行操作的方式。
誰能幫我整理出這個問題。 ?
由於事先

+0

提供的答案是正確的。傳遞給onClickListender的視圖是Button,可以投射。按鈕btn =(按鈕)v;然後用於訪問您設置的ID。 – madmik3

回答

23

請參見下面的代碼:

for(int i=0;i<nob;i++) { 
    Button btn = new Button(this); 
    btn.setId(i+1); 
    btn.setText("Button"+(i+1)); 
    btn.setLayoutParams(lprams); 
    final int index = i; 
    btn.setOnClickListener(new OnClickListener() { 
     void onClick(View v) { 
      Log.i("TAG", "The index is" + index); 
     } 
    }); 
    dynamicview.addView(btn); 
} 

我的例子很簡單,但是演示瞭如何獲得按鈕索引到OnClickListeber。您可以訪問聲明的匿名類中的任何final字段(例如OnClickListener)。

+0

它對我有幫助 – user1276092

+0

如果我想要在不同的按鈕上執行一些其他操作,該怎麼辦?我認爲如果我在你的點擊監聽器中編寫一些代碼它對於所有的按鈕都是一樣的,我怎樣才能在每個按鈕上實現不同的功能? –

+2

@ Dr.aNdRO邏輯問題與簡單的答案。爲了有不同的功能,你需要定義不同的'OnClickListener's。以任何你喜歡的方式做,只需將它們填入數組「OnClickListener []偵聽器」。然後在做'btn.setOnClickListener(listeners [i]);' –

5
for(int i=0;i<nob;i++){ 
     Button btn = new Button(this); 
     btn.setId(i+1); 
     btn.setText("Button"+(i+1)); 
     btn.setOnClickListener(btnclick); <<<<<<<set click 
     btn.setLayoutParams(lprams); 
     dynamicview.addView(btn); 
    } 

並添加外的任何方法和內部類這個聽者

OnClickListener btnclick = new OnClickListener() { 

     @Override 
     public void onClick(View view) { 

      switch(view.getId()){ 
       case 1: 
       //first button click 
       break; 
       //Second button click 
       case 2: 
       break; 
       case 3: 
       //third button click 
       break; 
       case 4: 
       //fourth button click 
       break; 
      . 
      . 
      . 
      default: 
       break; 
       } 

     } 
    }; 
+0

該corde中的訂單不正確。你想在循環之前讓偵聽器。 – madmik3

+1

不是一個適當的解決方案,因爲我不知道按鈕的數量,而且我不想爲每個按鈕添加一個案例。 –

+0

@mirroredAbstraction這是每個按鈕點擊最正確的解決方案...如果你不爲所有,那麼只需要onclick方法 –

1

其同樣的事情...

for(int i=0;i<nob;i++){ 
     Button btn = new Button(this); 
     btn.setId(i+1); 
     btn.setText("Button"+(i+1)); 
     btn.setLayoutParams(lprams); 
     btn.setOnCLickListsener(new listener()); 
     dynamicview.addView(btn); 
    } 

listener implemnets OnClickListenere{ 

public void onClick(View v){ 

} 

}

1
for(int i=0;i<nob;i++){ 
     Button btn = new Button(this); 
     btn.setId(i+1); 
     btn.setText("Button"+(i+1)); 
     btn.setLayoutParams(lprams); 
     btn.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       /////Do some job on button click 
      } 
     }); 
     dynamicview.addView(btn); 
    } 
1

使用List並添加Button是你創建與List

List<Button> list = new ArrayList<Button>(); 

現在添加您的按鈕,該列表

for(int i=0;i<nob;i++){ 
     Button btn = new Button(this); 
     btn.setId(i+1); 
     btn.setText("Button"+(i+1)); 
     btn.setLayoutParams(lprams); 
     dynamicview.addView(btn); 
     list.add(btn); 
    } 

然後用先進的for循環遍歷列表,並添加點擊監聽器爲每個按鈕..

for(Button btn : list){ 
btn.setOnClickListener(this); 
} 
1

也許這將是有幫助的人,我想用一個計數器變量組動態創建的按鈕:

我創建了陣列櫃:

int[] squatReps; 

從喜好我已經採取了元素的數量:

squatReps = new int[squatSets]; // where squatSets is taken from preferences 

最後我們創建的按鈕

for (int i = 0; i < squatSets; i++){ 
       squatReps[i] = Integer.parseInt(sharedPreferences.getString("squats_reps", "0")); 
       final Button squat_b = new Button(this.getActivity()); 
       squat_b.setId(i); 
       squat_b.setText(""); 
       squat_b.setLayoutParams(layoutParams); 
       final int index = i; 
       squat_b.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 

         squat_b.setText(Integer.toString(squatReps[index]--));  
         startTimer();         
        } 
       }); 
       panel_1.addView(squat_b);