Android:按ID查找按钮

时间:2013-01-11 21:25:19

标签: java android

找到按钮时遇到问题。我有一个AlertDialog我选择了5个选项中的一个。当我选择一个选项时,我想改变我点击的按钮的颜色。我在<RealativeLayout>内的xml文件中声明了按钮,但是当我尝试使用findViewById方法通过id(id's类似于“id1”,“id2”...)找到我的按钮时,一个错误,它说我不能像我一样使用这种方法:

AlertDialog.Builder builder = new AlertDialog.Builder(StartGameActivity.this);

builder.setTitle(R.string.pickColor);
builder.setItems(R.array.colorArray, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
        Button btn_tmp;
        String theButtonId = "id";
        theButtonId = theButtonId+(String.valueOf(which));
        btn_tmp = (Button) findViewById(theButtonId);
    }
});

我该如何解决这个问题,或者我应该使用其他方法?

修改

我想我解决了我的问题。我使用了Button的方法之一:getId(),如下所示:

final int id = clickedButton.getId();
final ImageButton btn_tmp;
btn_tmp = (ImageButton)findViewById(id);

4 个答案:

答案 0 :(得分:3)

背景:ID是实际变量

XML文件中,我们为资源提供ID,然后编译器使用所有这些来生成gen/R.java。基本上,这些ID是属于R类的int变量。 R.java的一个例子:

// btw this file should never be edited!
public final class R {
  public static final class id {
    public static final int id1=0x7f0100aa;
    public static final int id2=0x7f0100ab;
  }
}

仅仅因为存在包含变量(String)的有效名称的R.id.id1,它无法神奇地访问该变量。为此,可以使用reflection。但是,在这种情况下,我认为这是一种不必要的复杂情况,甚至会slower

findViewById需要一个ID(整数变量):

您无法为此功能提供String。您应该使用整数值,特别是与R.java中的int变量对应的整数值。 例如:

findViewById(R.id.id1) // for your 1st button

解决方案:

您可以动态选择整数值:

AlertDialog.Builder builder = new AlertDialog.Builder(StartGameActivity.this);

builder.setTitle(R.string.pickColor);
builder.setItems(R.array.colorArray, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
        Button btn_tmp;
        int chosenID=-1;

        switch (which) {
        case 1:   chosenID=R.id.id1;
                  break;
        case 2:   chosenID=R.id.id2;
                  break;
        }
        btn_tmp = (Button) findViewById(chosenID);
    }
});

还建议使用更多解释性ID,例如:buttonDoThisbuttonDoThat

答案 1 :(得分:2)

btn_tmp = (Button)findViewById(R.id.YourButtonId);

您正在传递字符串而不是整数。

答案 2 :(得分:0)

您正在尝试将findViewById()与包含ID的变量名称的String一起使用。 Java不支持这种动态变量名,因为变量名仅在编译时而不是运行时才知道。你想做什么?您需要找到另一种方法来解决此问题。请进一步解释,我们可以给出建议。

答案 3 :(得分:0)

如果您使用自己的layout.xml作为对话框,则需要先对其进行充气并将视图提供给对话框构建器。

LayoutInflater layoutInflater = (LayoutInflater) StartGameActivity.this.getSystemService(
                    Context.LAYOUT_INFLATER_SERVICE);

final RelativeLayout customDialogView= (RelativeLayout) layoutInflater.inflate(R.layout.custom_dialog_view, null);


AlertDialog.Builder builder = new AlertDialog.Builder(StartGameActivity.this);

builder.setTitle(R.string.pickColor);
//give the custom view to your dialog builder.
builder.setView(customDialogView);
builder.setItems(R.array.colorArray, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
    Button btn_tmp;

    switch(which){

    //....cases

    case 1:
         btn_tmp = (Button) customDialogView.findViewById(R.id.button1);
         //set the color of the button selected
         break;

    case 2:
         btn_tmp = (Button) customDialogView.findViewById(R.id.button2);
          //set the color of the button selected
         break;
    }

     //....cases
}
});