【问题标题】:Implementing OnClickListener for dynamically created buttons in Android在 Android 中为动态创建的按钮实现 OnClickListener
【发布时间】:2012-05-20 13:01:30
【问题描述】:

我通过代码而不是 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);
     }


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

【问题讨论】:

  • 提供的答案是正确的。传递给 onClickListender 的视图是 Button,可以进行强制转换。按钮 btn = (按钮)v;然后用来访问你设置的id。

标签: android android-layout android-widget


【解决方案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);
    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)。

【讨论】:

  • 如果我想对不同的按钮执行一些其他操作怎么办?我想如果我在你的点击监听器中写一些代码所有的按钮都是一样的,我怎样才能在每个按钮上实现不同的功能?
  • @Dr.aNdRO 带有简单答案的逻辑问题。为了具有不同的功能,您需要定义不同的OnClickListeners。以您喜欢的任何方式进行操作,然后将它们填充到数组 OnClickListener [] listeners 中。然后在for做btn.setOnClickListener(listeners[i]);
【解决方案2】:
   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;
              }

        }
    };

【讨论】:

  • 此绳索中的顺序不正确。你想在循环之前制作监听器。
  • 不是一个合适的解决方案,因为我不知道手头的按钮数量,而且我不想为每个按钮添加一个案例。
  • @mirroredAbstraction 这是每个按钮点击的最合适的解决方案......如果你不这样做,那么只需要 onclick 方法
【解决方案3】:

使用List 并将您创建的Buttons 添加到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循环遍历列表并为每个Button添加点击监听器..

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

      都是一样的……

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

      }

      【讨论】:

        【解决方案6】:
        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);
             }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多