为 Android 中动态创建的按钮实现 OnClickListener

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10673628/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 04:33:26  来源:igfitidea点击:

Implementing OnClickListener for dynamically created buttons in Android

androidandroid-layoutandroid-widget

提问by user1276092

I dynamically created buttons through code rather than from XML.
The code is as below :

我通过代码而不是从 XML 动态创建按钮。
代码如下:

    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);
     }


I am not finding a way in which I can implement OnClickListener to each of these buttons so that I can perform action based on the reference I get.
Can anyone help me in sorting out this issue. ?
Thanks in Advance,


我没有找到可以对这些按钮中的每一个实现 OnClickListener 的方法,以便我可以根据获得的参考执行操作。
谁能帮我解决这个问题。?
提前致谢,

回答by Boris Strandjev

See the code below:

请参阅下面的代码:

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);
}

My example is pretty simple, but demonstrates how you can get the button index into the OnClickListeber. You can access any finalfield in the declared anonymous classes (e..g the OnClickListener).

我的示例非常简单,但演示了如何将按钮索引放入OnClickListeber. 您可以访问final声明的匿名类中的任何字段(例如OnClickListener)。

回答by Samir Mangroliya

   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);
     }

And add this listner outside the any method and inside class

并在任何方法和类内部添加此侦听器

 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;
              }

        }
    };

回答by Arif Nadeem

Use a Listand add Buttons you create to that List

使用 aList并添加Button您创建的 sList

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

Now add your button to that List

现在将您的按钮添加到该列表

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);
     }

Then use advanced for loop to iterate through the list and add click listener for each Button..

然后使用高级 for 循环遍历列表并为每个按钮添加单击侦听器。

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

回答by Leo240

Maybe this will be helpful for somebody I wanted to use the one counter variable for group of dynamically created buttons:

也许这对我想对动态创建的按钮组使用一个计数器变量的人会有所帮助:

I've created the array for counters:

我已经为计数器创建了数组:

int[] squatReps;

From preferences I've taken the quantity of elements:

从偏好中,我采用了元素的数量:

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

And finally we create the buttons

最后我们创建按钮

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);

回答by ngesh

its the same thing...

这是同一件事...

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){

}

}

}

回答by ρяσ?ρ?я K

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);
     }