10

我在查找按钮时遇到问题。我有一个AlertDialog选择 5 个选项之一的地方。当我选择一个选项时,我想更改我单击的按钮的颜色。我在里面的 xml 文件中声明了按钮,<RealativeLayout>但是当我试图通过 id 找到我的按钮(id 就像“id1”,“id2”......)使用该findViewById方法时,有一个错误,它说我不能像我一样使用这种方法:

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

4 回答 4

4

背景: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;
  }
}

仅仅因为 aString存在包含变量的有效名称 ( R.id.id1),它就不能神奇地访问该变量。为此,可以使用reflection. 但是,在这种情况下,我认为这是不必要的并发症,甚至会更慢

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

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

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,例如:buttonDoThis, buttonDoThat.

于 2013-01-11T21:32:31.773 回答
3
btn_tmp = (Button)findViewById(R.id.YourButtonId);

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

于 2013-01-11T21:32:54.830 回答
1

如果您对对话框使用自己的 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
}
});
于 2013-01-11T21:38:31.520 回答
0

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

于 2013-01-11T21:37:02.097 回答