动态创建按钮和设置onClickListener
-
25-09-2019 - |
题
我有问题与Android处理动态创建的按钮。我创建N个按钮和我有被点击按钮时做同样的方法,但我必须知道被点击了哪个按钮。
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);
Cucurrently我添加ID的每一个按钮,我使用下面的方法来查看哪个按钮被点击。 (线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事件?任何建议?
解决方案
您可以创建返回onclickListener和需要一个按钮作为参数的方法。然后使用该方法来设置onClicklistener在你有第一环路..
更新:代码可以沿着这些线路被soemthing:
View.OnClickListener getOnClickDoSomething(final Button button) {
return new View.OnClickListener() {
public void onClick(View v) {
button.setText("text now set.. ");
}
};
}
如在活性的方法,然后在这样的循环使用它
button.setOnClickListener(getOnClickDoSomething(button));
其他提示
我得到这一个溶液.. 在的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创建返回类型View.OnClickListener的一种方法是这样..
View.OnClickListener handleOnClick(final Button button) {
return new View.OnClickListener() {
public void onClick(View v) {
}
};
}
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);
调用此侦听
查看的ID不应当被用于这些目的,因为视图ID是在编译时间取决于在XML布局文件定义的ID生成。
只要将自己的ID,其中可在视图级别(所以按键继承他们)的setTag()方法。这个“标签”可以是任何东西,让你认识到从他人查看。你检索其与getTag()值
代替使用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");
}
}
}
“这并不好看我”为什么不呢?不工作?您还可以创建一个静态成员变量保存所有添加按钮的列表,然后查找在该列表中点击的按钮来代替。
我不知道为什么你会想创建n个按钮,它看起来像你的N值大于10,至少,如果你是不是想告诉他们一次全部(我的意思是所有的人都适合一个单一的屏幕,没有滚动),你可以尝试回收无形的按钮,就像我们使用列表视图持有者列表视图做。这将减少你的内存占用并提升性能,并区分你对他们设置的文字或标记或者基于按钮或你竟然能够把那些小的数字按钮的参考。
优选不乱用的ID,和setTag getTag方法被设计用于该目的,它的快速和清洁方法来设置一堆按钮听众的在动态布局
这答案或许您有所帮助: https://stackoverflow.com/a/5291891/2804001
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");
}
}