在Android

时间:2015-08-21 14:40:35

标签: android

我的程序要求用户输入他们的名字,然后点击一个名为btn的按钮。单击btn后,它们的名称将动态添加到TableRow以及另一个动态创建的Button。正是这些按钮我遇到了问题。我需要稍后在程序中访问它们。我在res / value文件夹中创建了许多ID来跟踪每个ID(changebtn1,changebtn2等)。它们都存储在名为buttonIDs的数组中。

假设用户输入第一个名称,使用动态创建的按钮创建新行:

 btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tableRow = new TableRow(getApplicationContext());
            Button changeButton = new Button(getApplicationContext());

            changeButton.setText("Change");
            changeButton.setId(buttonIDs[i]);//From res/values

            tableRow.addView(changeButton);
            tableLayout.addView(tableRow);
            i++;
        });

现在让我们说他们输入第二个名字,创建另一个Button等等。我现在如何将OnClickListener设置为我创建的第一个Button,其ID为R.id.changeBtn1?换句话说,我有所有这些动态创建的按钮,我不知道如何将OnClickLsteners()添加到早期的按钮或无论如何访问它们。谢谢

3 个答案:

答案 0 :(得分:1)

或者您在创建按钮时直接附加OnClickListener,或者您可以存储对按钮的引用,如下所示:

ArrayList<Button> buttons = new ArrayList<Button>();
btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        tableRow = new TableRow(getContext());
        Button changeButton = new Button(getContext());
        buttons.add(changeButton);

        changeButton.setText("Change");
        changeButton.setId(buttonIDs[i]);//From res/values

        tableRow.addView(changeButton);
        tableLayout.addView(tableRow);
        i++;
    });

for(Button button: buttons){
    button.setOnClickListener(new OnClickListener()
       ...etc...
    );
}

您不会浪费大量内存,因为buttons.add()行不会复制数组中的按钮,只会复制按钮的引用。如果您需要id访问按钮,请使用HashMap,如下所示:

HashMap<String, Button> map = new HashMap<String, Button>();
map.put("id", new Button(getContext()));

然后像这样访问它:

Button button = map.get("id");

答案 1 :(得分:0)

这样的事情

for(int i=0;i<buttonIDs.size();i++) {
   Button currentButton = (Button) findViewById(buttonIDs[i]);
   currentButton.setOnClickListener(new View.OnClickListener() {
       public void onClick(View v) {
          // Stuff
       }
   }); 
}

我没有检查代码

答案 2 :(得分:0)

@filnik你的回答的第一部分也给了我一个想法。我在OnCreate()方法之外创建了一个OnClickListener方法。

View.OnClickListener changeTeamName(final Button button)  {
    return new View.OnClickListener() {
        public void onClick(View v) {
            //Do Stuff
        }
    };
}

然后我将OnClickListener设置为EACH动态创建的Button并使用我创建的方法。

            changeButton.setText("Change");
            changeButton.setTag("ButtonOne");

            changeButton.setOnClickListener(changeTeamName(changeButton));

现在每个Button都有一个与之关联的OnClickListener,它们现在可以执行我添加到方法中的任何功能。