引用动态创建的按钮

Reference to dynamically created Buttons

我一直在寻找如何动态创建按钮。终于明白了
但是,我还不知道如何引用特定创建的 Button。
例如,在我下面的示例中,如何在单击时将特定按钮的文本显示为红色?

也就是它的id怎么放:

Button button_pulsado = (Button) findViewById(R.id.???????);
Button.setTextColor(Color.RED);

这是我的例子:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      List<String> myList = new ArrayList<String>();
      myList.add("A");
      myList.add("B");
      myList.add("C");
      myList.add("D");

      for (int i = 0; i < myList.size(); i++) {
        Button myButton = new Button(this);
        myButton.setText(myList.get(i));

        LinearLayout ll = (LinearLayout) findViewById(R.id.layout1);
        LinearLayout.LayoutParams lp = new       LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        ll.addView(myButton, lp);
      }
    }
}

要解决 findViewById 问题,您可以存储 List<Button>

public class MainActivity extends AppCompatActivity {
    private List<Button> buttons = new ArrayList<Button>();

在构建动态视图时添加。

ll.addView(myButton, lp);
buttons.add(myButton);

使用 buttons.get(int position) 而不是 findViewById


关于...

For instance, in my example below, how could I put the text of a specific Button in red when clicked?

您可以在将每个按钮添加到视图中时在单独的点击侦听器中设置颜色。

class ColorClickListener implements View.onClickListener {
    private String color;
    ColorClickListener(String color) {
        this.color = color;
    }
    @Override 
    public void onClick(View v) {
        // v.setBackground(color); // For example... API may not like this
    }
}

从 Activity

String [] colors = new String[] {"#fff", "#ccc"}; 

for (int i = 0; i < colors.length; i++) {
    Button b = new Button(this);
    b.setOnClickListener(new ColorClickListener(Color.parseColor(colors[i])));
}

不需要调用findViewById()onClickMethod() 有一个 View 参数,它引用了被点击的视图:

private changeColorClick = new OnClickListener() {
    @Override
    public void onClick(View v) {
        buttons.add(myButton);
        v.setTextColor(Color.RED);
    }

}

现在进入循环:

for (int i = 0; i < myList.size(); i++) {
    Button myButton = new Button(this);
    myButton.setTextColor(myList.get(i));
    myButton.setOnClickListener(changeColorClick);
}

如果您希望每个按钮更改为不同的颜色,您可以使用构造函数将 OnClickListener 创建为命名的 class:

public ColorClick implements OnClickListener() {
    private Color color;
    public ColorClick(Color color) {
        this.color = color;
    }
}

现在您需要一个 ListColor 个对象的 Map 数组,以便在构建 OnClickListener 期间使用。例如,

Color[] colors = new Color[]{Color.RED, Color.GREEN, Color.BLUE};
for (int i = 0; i < myList.size(); i++) {
    Button myButton = new Button(this);
    myButton.setTextColor(myList.get(i));
    myButton.setOnClickListener(new ColorClick(colors[i]);
}

或者您可以在按钮上使用 setTag()