【问题标题】:Button setOnClickListener on for loopfor循环上的按钮setOnClickListener
【发布时间】:2013-12-26 11:06:16
【问题描述】:

我有 10 个按钮,我想为所有按钮设置 OnClickListener。此外,单击任何按钮应用程序将进行另一项活动。我只在活动类上发布按钮的定义。我的代码;

Button button1 = (Button) findViewById(R.id.button1);
Button button2 = (Button) findViewById(R.id.button2);
Button button3 = (Button) findViewById(R.id.button3);
Button button4 = (Button) findViewById(R.id.button4);
Button button5 = (Button) findViewById(R.id.button5);
Button button6 = (Button) findViewById(R.id.button6);
Button button7 = (Button) findViewById(R.id.button7);
Button button8 = (Button) findViewById(R.id.button8);
Button button9 = (Button) findViewById(R.id.button9);
Button button10 = (Button) findViewById(R.id.button10);
Button buttons[] = {button1, button2, button3, button4, button5, button6, button7, button8, button9, button10};
final String urlOfButtons[] = {"","","","","","","","","","",""};
final String titles[] = {"","","","","","","","","","",""};

JsonNode itemNode = jsonNode.path("Docs");
for(int i=0 ; i<itemNode.size() ; i++){
    titles[i] = itemNode.get(i).path("Text").asText();
            title = titles[i];
    buttons[i].setText(title);
    urlOfButtons[i] = itemNode.get(i).path("Link").asText();
            url = urlOfButtons[i];
    buttons[i].setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent = new Intent(HouseDetail.this, HouseDetailPdf.class);
            intent.putExtra("title", title);
            intent.putExtra("url", url);
            startActivity(intent);
        }
    });
}

这通常只取 title 和 url 的最后一个值。字符串 url,标题定义在类的顶部。我单击的每个按钮都将相同的值转到其他活动。我想要 10 个不同的值来添加额外的值。所以我想添加而不是标题和网址;标题[i] 和 url[i] 作为额外的。我希望我很清楚。

【问题讨论】:

  • 您是通过编程方式还是在 xml 布局中添加这些按钮?
  • 我当然会在布局中添加这些按钮。

标签: android buttonclick


【解决方案1】:

试试这个..

您已将titleurl 值传递给下一个活动。但是,在for loop 的末尾,titleurl 将只有 for 循环的最后一个值。因此,不管button click 是什么,只有titleurl 中最后存储的值只会进入下一个活动。

您可以使用setTag(int key, Object tag) 并将buttontitle 值设置为for loop 内的标签,您可以使用getTag(int key) 方法在button 内点击检索它们。 .

JsonNode itemNode = jsonNode.path("Docs");
for(int i=0 ; i<itemNode.size() ; i++){
    titles[i] = itemNode.get(i).path("Text").asText();
            title = titles[i];
    buttons[i].setText(title);

    urlOfButtons[i] = itemNode.get(i).path("Link").asText();
            url = urlOfButtons[i];

    buttons[i].setTag(1,title);
    buttons[i].setTag(2,url);

    buttons[i].setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            Intent intent = new Intent(HouseDetail.this, HouseDetailPdf.class);
            intent.putExtra("title", v.getTag(1));
            intent.putExtra("url", v.getTag(2));
            startActivity(intent);
        }
    });
}

setTag(int key, Object tag);

getTag(int key);

【讨论】:

  • 我试过了,但我的值不能在 onclicklistener 上标记。
  • 将 'i' 的修饰符更改为 final 。 Eclipse 给出了这个建议。
  • 我不确定这是否正确。到onClick 被调用时,for 循环已经运行完成,i 将始终等于itemNode.size()(如果你能让编译器让它通过,我对此表示怀疑 - java 有语法规则对这种事情皱眉)
  • 哟,Tamilan:目前您的建议创建了 10 个具有相同代码的 OnClickListeners,这让垃圾收集器感到难过......(不是很伤心,但你知道。最好避免悲伤: ) )
  • 感谢您的建议,但我使用了另一个答案。您的解决方案也有效。
【解决方案2】:

您可以在循环的每次迭代中获取相关的 titleurl 并将它们存储在 final 中,然后您可以在 onClickListener 中使用它们。

for(int i=0 ; i<itemNode.size() ; i++){
    final String title = itemNode.get(i).path("Text").asText();
    final String url = itemNode.get(i).path("Link").asText();
    buttons[i].setOnClickListener(/* same as you had before */);
}

(警告:未经测试的代码)。

显然,如果您在其他地方使用titles 和 urls 数组,您也应该在那里分配值。

【讨论】:

  • 我也应该将'int i'的修饰符更改为final?那么 for 循环中的 i++ 呢?
  • 不。如果您从OnClickListener 的主体内部引用它,您只需要i 是最终的。在我建议的代码中,对于循环的每次迭代,我们创建一个新变量title 和一个基于i 的新变量url。然后每次我们构建一个新的OnClickListener,它依赖于titleurl。所以i可以通过循环改变和跟踪,而titleurl从每个OnClickListener的角度来看是不变的
  • @abhishek V 的答案比这更好,不过 - 为什么有 10 个 OnClickListeners 什么时候可以呢?
【解决方案3】:

你的类应该像这样实现 onclickListner:

public class HomeScreen extends Activity implements OnClickListener

初始化你的按钮:

Button button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(this);
Button button2 = (Button) findViewById(R.id.button2);
button2.setOnClickListener(this);
Button button3 = (Button) findViewById(R.id.button3);
button3.setOnClickListener(this);
Button button4 = (Button) findViewById(R.id.button4);
butto4.setOnClickListener(this);

处理所有按钮的点击项:

public void onClick(View v) {
        switch (v.getId()) {        
        case R.id.button1:
            Intent intent = new Intent(HouseDetail.this, HouseDetailPdf.class);
            intent.putExtra("title", title);
            intent.putExtra("url", url);
startActivity(intent);
            break;
        case R.id.button2:
                Intent intent = new Intent(HouseDetail.this, HouseDetailPdf.class);
            intent.putExtra("title", title);
            intent.putExtra("url", url);
startActivity(intent);
            break;
        case R.id.button3:
                Intent intent = new Intent(HouseDetail.this, HouseDetailPdf.class);
            intent.putExtra("title", title);
            intent.putExtra("url", url);
startActivity(intent);
            break;
        case R.id.button4:
                Intent intent = new Intent(HouseDetail.this, HouseDetailPdf.class);
            intent.putExtra("title", title);
            intent.putExtra("url", url);
startActivity(intent);
            break;
        }

【讨论】:

    【解决方案4】:

    您可以将titleurl 设置为每个按钮的标记

    buttons[i].setTag(1, title);
    buttons[i].setTag(2, url);
    

    并重新获取onClick中的标签

    @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(HouseDetail.this, HouseDetailPdf.class);
                intent.putExtra("title", v.getTag(1));
                intent.putExtra("url", v.getTag(2));
                startActivity(intent);
            }
    

    否则您可以执行类似的操作。将index 存储为标签,以便在单击button 时获得index

    buttons[i].setTag(i);
    

    获取存储为tagindex

    @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                 int position = Integer.parseInt(v.getTag().toString());
                Intent intent = new Intent(HouseDetail.this, HouseDetailPdf.class);
                intent.putExtra("title", titles[position]);
                intent.putExtra("url", urlOfButtons[position]);
                startActivity(intent);
            }
    

    【讨论】:

    • 我用的是上面那个。非常有用的想法我永远不会忘记那种方式:)
    • 我相信第二种解决方案比第一种解决方案更好,因为它节省的内存很少:)
    • 我也会试试 :)
    【解决方案5】:

    避免这个循环是一个好方法。只需在 xml 文件中定义 url 和标题即可。

    你可以把它放在你的按钮定义中:

    android:tag="title|url"
    

    然后,您应该在 onClickListener 中输入:

            @Override
            public void onClick(View v) {
                if(v.getTag() != null){
                            String[] details = v.getTag().split("|");
                            Intent intent = new Intent(HouseDetail.this, HouseDetailPdf.class);
                            intent.putExtra("title", details[0]);
                            intent.putExtra("url", details[1]);
                            startActivity(intent);
                }
            }
        });
    

    然后,循环就可以用来 setOnClickButtonListener(listener); 但是可以肯定的是,你必须像上面的代码那样定义这个监听器。

    【讨论】:

      猜你喜欢
      • 2014-10-06
      • 2016-03-20
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 2017-04-03
      • 1970-01-01
      • 2016-10-05
      相关资源
      最近更新 更多