dynamic创buildbutton并设置onClickListener

我有处理在Android上dynamic创build的button的问题。 我创build了N个button,点击button时我必须做同样的方法,但是我必须知道点击了哪个button。

for (int i = 0; i < NO_BUTTONS; i++){ Button btn = new Button(this); btn.setId(2000+i); ... btn.setOnClickListener((OnClickListener) this); buttonList.addView(btn); list.add(btn); 

目前我正在为每个button添加ID,并使用下面的方法来查看哪个button被点击。 (行btn.setId(2000+i);btn.setOnClickListener((OnClickListener) this); )。 该方法也在活动中实施。

 @Override public void onClick(View v) { switch (v.getId()){ case 2000: selectButton(0); break; ... case 2007: selectButton(7); break; } } 

这不好看,所以我问有没有更好的方法来做到这一点? 或者如何发送一些信息到onclick事件? 有什么build议么?

Solutions Collecting From Web of "dynamic创buildbutton并设置onClickListener"

你可以创build一个方法返回一个onclickListener,并把一个button作为参数。 然后使用该方法在第一个循环中设置onClicklistener ..

更新:代码可能是这样的:

 View.OnClickListener getOnClickDoSomething(final Button button) { return new View.OnClickListener() { public void onClick(View v) { button.setText("text now set.. "); } }; } 

作为活动中的一个方法,然后像这样在循环中使用它

 button.setOnClickListener(getOnClickDoSomething(button)); 

我得到了一个解决scheme..在onCreate中使用此代码

 linear = (LinearLayout) findViewById(R.id.linear); LayoutParams param = new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1.0f); Button[] btn = new Button[num_array_name.length]; for (int i = 0; i < num_array_name.length; i++) { btn[i] = new Button(getApplicationContext()); btn[i].setText(num_array_name[i].toString()); btn[i].setTextColor(Color.parseColor("#000000")); btn[i].setTextSize(20); btn[i].setHeight(100); btn[i].setLayoutParams(param); btn[i].setPadding(15, 5, 15, 5); linear.addView(btn[i]); btn[i].setOnClickListener(handleOnClick(btn[i])); } 

在onCreate之后创build一个返回typesView.OnClickListener的方法就像这样..

 View.OnClickListener handleOnClick(final Button button) { return new View.OnClickListener() { public void onClick(View v) { } }; } 

视图ID不应该用于这些目的,因为视图ID是在编译时生成的,具体取决于xml布局文件中定义的ID。

只需将您自己的ID放置在视图级别可用的setTag()方法中(以便Buttonsinheritance它们)。 这个“标签”可以是任何可以让你识别来自其​​他人的视图的东西。 你用getTag()检索它的值。

 Button.OnClickListener btnclick = new Button.OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub Button button = (Button)v; Toast.makeText(getApplicationContext(), button.getText().toString(),2).show(); } }; 

通过btn.setOnClickListener(btnclick);调用此侦听器btn.setOnClickListener(btnclick);

“这对我来说不好看”为什么不呢? 不行吗? 您也可以创build一个静态成员variables来保存所有添加的button的列表,然后在该列表中查找单击的button。

我不知道你为什么要创buildN个button,看起来你的N值至less大于10,如果你不是一次性显示它们(我的意思是把它们全部放在一个屏幕上,不滚动),你可以尝试回收不可见的button,就像我们使用列表视图持有人列表视图。 这样可以减less你的内存占用,提高性能,并根据你设置的文本或标签来区分button,甚至可以保持对less量button的引用。

最好不要搞ids,setTag和getTag方法是为了这个目的而devise的,它是在dynamic布局上设置一堆button侦听器的快捷方式

这个答案可能会帮助您: https : //stackoverflow.com/a/5291891/2804001

而是使用setTag()函数来轻松区分。

  for(int i=0;i<4;i++) { Button btn = new Button(this); btn.setTag(i); btn.setOnClickListener(new View.OnclickListener() { @Override public void onClick(View v) { int i=v.getTag(); switch(i) { case 1: btn.setText(i); break; case 2: btn.setText(i); break; case 3: btn.setText(i); break; case 4: btn.setText(i); break; default: btn.setText("Others"); } } } 
 public class MainActivity extends Activity implements View.OnClickListener { LinearLayout linearLayout; Button [] button; View.OnClickListener listener; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); linearLayout=(LinearLayout)findViewById(R.id.parent_lay); String[] array={"U123","U124","U125"}; int length=array.length; System.out.println("11111111111111111111111111"); button=new Button[length]; for(int i=0;i<length;i++) { button[i]=new Button(getApplicationContext()); button[i].setId(i); button[i].setText("User" + i); button[i].setOnClickListener(this); linearLayout.addView(button[i]); } } @Override public void onClick(View view) { view.getId(); Button button=(Button)findViewById(view.getId()); button.setText("Changed"); } }