Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 动态创建按钮并设置onClickListener_Android_Button_Android Widget_Android Layout - Fatal编程技术网

Android 动态创建按钮并设置onClickListener

Android 动态创建按钮并设置onClickListener,android,button,android-widget,android-layout,Android,Button,Android Widget,Android Layout,我在处理Android上动态创建的按钮时遇到问题。我正在创建N个按钮,我必须在单击按钮时使用相同的方法,但我必须知道单击了哪个按钮 for (int i = 0; i < NO_BUTTONS; i++){ Button btn = new Button(this); btn.setId(2000+i); ... btn.setOnClickListener((OnClickListener) this);

我在处理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);

这对我来说不太好,所以我在问有没有更好的方法?或者如何向onclick事件发送一些信息?有什么建议吗?

“我觉得这不太好”为什么不呢?这不管用吗?您还可以创建一个静态成员变量,其中包含所有已添加按钮的列表,然后在该列表中查找已单击的按钮。

您可以创建一个方法,返回onclickListener并将按钮作为参数。然后使用该方法在第一个循环中设置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));

视图ID不应用于这些目的,因为视图ID是在编译时根据xml布局文件中定义的ID生成的


只需将自己的ID放在视图级别可用的setTag()方法中(这样按钮就可以继承它们)。此“标记”可以是任何允许您从其他视图中识别视图的内容。您可以使用getTag()检索其值。

我不知道为什么要创建N个按钮,如果您不想一次显示所有按钮(我的意思是将所有按钮都放在一个屏幕中,不滚动),则N的值至少大于10您可以尝试回收不可见的按钮,就像我们使用列表视图支架回收列表视图一样。这将减少内存占用并提高性能,并根据您在按钮上设置的文本或标签区分按钮,或者您甚至可以保留对这些少量按钮的引用

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)调用此侦听器

我有一个解决方案。。 在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]));

}

最好不要弄乱ids,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");
             }
         }
     }
for(int i=0;i
public class main活动扩展活动实现View.OnClickListener
{
线性布局线性布局;
按钮[]按钮;
View.onclick侦听器;
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
linearLayout=(linearLayout)findViewById(R.id.parent\u lay);
字符串[]数组={“U123”、“U124”、“U125”};
int length=array.length;
System.out.println(“11111111111111111”);
按钮=新按钮[长度];

对于(int i=0;我认为这违反了某些原则或某事..我不喜欢switch语句..我想在添加OnClickListener时传递一些数据/变量,以便我以后可以知道单击了哪个按钮..可能吗?@Ante B:好的,您可以在onClick方法上执行类似操作:selectButton(v.getId()-2000);或者,您也可以创建一个名为SelectedBtn的静态变量,然后在onClick方法上执行类似的操作:SelectedBtn=v;这样,您可以引用应用程序其他部分中单击的按钮-注意,这样做甚至可以避免给您的按钮赋予nesty Id。但我不太清楚您在某个时间尝试做什么好的,如果你开发一个桌面应用程序,这是很好的。但是,我们谈论的是一个内存较少的移动设备。因此,你不需要只使用一个OnClickListener,而是创建了8个OnClickListener。这太多了。尽管它很难看,但我还是更喜欢第一种方法,并尝试在循环中做出选择,使其更好。@Om呃,你确定Android不会在编译时自行优化吗?我建议先实现干净、可维护和可读的代码,然后在发现性能问题时进行优化。而不是反过来。除非你的数字高得离谱,否则我认为这不重要。即使你注意到问题,你仍然可以进行优化首先是方法..例如,从缓存返回侦听器..N的值是[4,16],我试图立即显示它们..我用它们来演示排序算法..我非常喜欢这里给出的想法,但发现由于getTag()返回一个“对象”,即使对于包含整数(1,2,…)的简单标记,一个类似于
开关的构造(Integer.parseInt(v.getTag().toString()){case 1:…
似乎是必要的,可能需要额外的try-catch处理,我不知道如何以优雅的方式嵌入她。setId()的使用正如OP建议的那样,它看起来不那么干净,但相比之下要简单得多。对此有什么想法吗?如果您将标记存储为整数,只需将其类型转换为整数就足够了,您不需要调用toString方法,然后将其解析为整数。
(Integer)v.getTag()
。我在尝试在for循环中创建按钮时发现了问题,因为我在循环中声明了onClick()方法。正如我看到的onClick()一样,这种方法非常适合我必须是循环外的。如果您必须对案例1到案例4执行相同的操作,为什么还要分别编写它们呢?我给出了使用标记区分视图的通用代码…以便在循环中提供单击侦听器。。。
View.OnClickListener handleOnClick(final Button button) {
    return new View.OnClickListener() {
        public void onClick(View v) {
        }
    };
}
 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");
}
}