如何引用以编程方式设置的对象的id?

时间:2015-09-26 08:27:30

标签: android

在for循环中,我在屏幕上放置按钮并将其ID设置为

   LinearLayout layout = (LinearLayout) findViewById(R.id.linear_layout_tags);
    layout.setOrientation(LinearLayout.VERTICAL);
    Button btn = null;
    for (int i = 0; i < buttons_in_row; i++) {
        LinearLayout row = new LinearLayout(this);
        row.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));

        for (int j = 0; j < buttons_in_row; j++) {
            btn = new Button(this);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1.0f);
            params.setMargins(5, 5, 5, 5);
            btn.setLayoutParams(params);
            btn.setText("B " + (j + 1 + (i * buttons_in_row)));
            btn.setId(j + 1 + (i * buttons_in_row));
            btn.setWidth(width / buttons_in_row);
            btn.setHeight(width / buttons_in_row);
            btn.setBackgroundResource(R.drawable.button);
            GradientDrawable drawable = (GradientDrawable) btn.getBackground();
            drawable.setColor(Color.parseColor("#" + colors[random_color][0]));
            btn.setOnClickListener(this);
            //Log.i("btn.getsize", btn.getWidth() + ", " + btn.getHeight());
            row.addView(btn);
        }


        layout.addView(row);
    }
    Button b = (Button) layout.findViewById(2);

在循环结束时,我想选择其中一个按钮(例如No.2)并给它一个不同的背景颜色。

我试过这些

Button b = (Button) findViewById(2);
btn.getId(2);

我该怎么做?

3 个答案:

答案 0 :(得分:0)

您必须将这些按钮添加到视图(RelativeLayout或LinearLayout等);您可以通过该布局访问按钮。

例如你必须做这样的事情:

LinearLayout myLayout = (LinearLayout) findViewById(R.id.linear_layout_tags);

        for (int i = 0; i < 3; i++) {

            for (int j = 0; j < 4; j++) {
                Button btnTag = new Button(this);
                btnTag.setLayoutParams(new LinearLayout.LayoutParams(
                        LinearLayout.LayoutParams.WRAP_CONTENT,
                        LinearLayout.LayoutParams.WRAP_CONTENT));
                btnTag.setText("Button " + (j + 1 + (i * 4)));
                btnTag.setId(j + 1 + (i * 4));
                myLayout.addView(btnTag);
            }
        }

这里,考虑到这个例子,你可以通过它的id找到按钮:

Button b = (Button) myLayout.findViewById(WHAT_EVER_ID_I_SET_IN_LOOP);

<强>更新

在Android Studio中,点击灯泡上的这个&#39;错误&#39;。并选择在第一个子菜单中禁用检查。

最有可能的是,以这种方式创建的ID不会产生问题,但还有其他方法可以创建ID,请参阅以下链接。

How can I assign an ID to a view programmatically?

答案 1 :(得分:0)

您可以创建自己的按钮对象;

public class MyButton {

    private int id;
    private Button button;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Button getButton() {
        return button;
    }

    public void setButton(Button button) {
        this.button = button;
    }
}

然后,您可以创建一个Arraylist并像在循环中一样设置它们。创建另一个循环来查找;

public static Button findMyButton(int id) {
    for (MyButton myButton: myButtonList) {
        if (myButton.getId() == id)
            return myButton
    }
    return null;
}

当您手动设置按钮ID时,它可能与&#34;自动生成的来自android&#34;的任何视图的id重复。

答案 2 :(得分:0)

您可以通过两种方式识别您的观点。

  • byId
  • byTag。

如果您想以编程方式将Id设置为您的视图..您需要像这样设置..

masterLayout.setId(R.id.masterLayout);

R.id.masterLayout 来自 ids.xml ,位于 values文件夹

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="masterLayout" type="id">masterLayout</item>
</resources>

其他方法是识别视图&#34; byTag&#34;

Button button = new Button(this);
button.setText("Button "+i);
button.setTag(i);
button.setOnClickListener(this);
masterLayout.addView(button);

获取此视图..

@Override
public void onClick(View view) {
    switch((Integer)view.getTag()){
        case 0:
            Toast.makeText(this, "Clicked Button 0", Toast.LENGTH_SHORT).show();
            break;
        case 1:
            Toast.makeText(this, "Clicked Button 1", Toast.LENGTH_SHORT).show();
            break;
    }
}

在所有这些之前..你需要将你的视图添加到布局。

这里解释了完整的实施..

public class DynamicViewActivity extends Activity implements View.OnClickListener{
      private LinearLayout mLayout;
      @Override
      public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_dynamic_views);
            mLayout = (LinearLayout) findViewById(R.id.mLayout);
            createDynamicViews();
      }

      private void createDynamicViews() {
            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT
                    , LinearLayout.LayoutParams.MATCH_PARENT);
            ScrollView scrollView = new ScrollView(this);
            scrollView.setLayoutParams(layoutParams);

            LinearLayout masterLayout = new LinearLayout(this);
            masterLayout.setId(R.id.masterLayout);
            masterLayout.setLayoutParams(layoutParams);
            masterLayout.setOrientation(LinearLayout.VERTICAL);
            scrollView.addView(masterLayout);

            for(int i = 0; i < 2; i++){
                Button button = new Button(this);
                button.setText("Button "+i);
                button.setTag(i);
                button.setOnClickListener(this);
                masterLayout.addView(button);
            }

            mLayout.addView(scrollView);
      }

      @Override
      public void onClick(View view) {
            switch((Integer)view.getTag()){
                case 0:
                    Toast.makeText(this, "Clicked Button 0", Toast.LENGTH_SHORT).show();
                    break;
                case 1:
                    Toast.makeText(this, "Clicked Button 1", Toast.LENGTH_SHORT).show();
                    break;
            }
      }
}