2012-05-20 131 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);