2015-09-26 26 views
0

在for循环中,我将屏幕上的按钮并设置其ID为如何引用以编程方式设置的对象的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); 

在循环我要挑一个按钮(如第2号)的结束,并给它一个不同背景颜色。

我尝试了这些

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

我怎样才能做到这一点?

+0

也许使用阵列来存储它们,并从那里获得他们喜欢按钮[2]? – CDrosos

+0

你可以通过这种方式获得重复的值 - 如果你将'i,j'从0循环到5并且你连续有3个按钮,你会得到一些值两次 - 4,5,10 ... – TDG

+0

我是没有获得重复的值 – erdomester

回答

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中点击这个'错误'的灯泡。并在第一个子菜单中选择禁用检查。

大多数情况下,以这种方式创建的Id不会产生问题,但还有其他方法可以创建id的后续链接。

How can I assign an ID to a view programmatically?

+0

我也是这样做的,我在代码中加入了我的代码。在'按钮b =(按钮)row.findViewById(2);'我得到错误'预期的资源的类型id' – erdomester

+0

在Android Studio中点击灯泡与此'错误'行。并在第一个子菜单中选择禁用检查。 – penguin

+0

@erdomester是你的问题解决? – penguin

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并按照您在循环中设置它们的ID。创建另一个循环来查找;

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

当您手动设置您的按钮ID时,它可能会与“从android的任何视图的自动生成的ID”复制。

0

您可以通过两种方式确定你的看法..

  • byId
  • byTag。

如果你要ID设置你的意见编程..你需要设置这样的..

masterLayout.setId(R.id.masterLayout); 

其中R.id.masterLayoutids.xml这是内部值夹

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

其它方式是确定的观点是“byTag”

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; 
      } 
     } 
} 
相关问题