Android:通过ID查找button

我findbutton有问题。 我有一个AlertDialog ,我select了5个选项之一。 当我select一个选项,我想改变我点击的button的颜色。 我在<RealativeLayout>里面声明了xml文件中的button,但是当我试图通过使用findViewById方法的id(id是“id1”,“id2”…)来查找我的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; 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); 

Solutions Collecting From Web of "Android:通过ID查找button"

背景:ID是本质上的variables

XML文件中,我们给资源赋予ID,然后编译器使用所有这些来生成gen/R.java 。 所以基本上,这些ID是属于类R的intvariables。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; } } 

仅仅因为存在一个包含variables( R.id.id1 )的有效名称的String ,它不能神奇地访问该variables。 要做到这一点,可以使用reflection 。 不过,在这种情况下,我认为这是一个不必要的复杂情况,甚至会更慢 。

findViewById需要一个ID(整型variables):

你不能给这个函数提供一个String 。 你应该使用一个整数值,特别是那些对应于R.java intvariables的值。 例如:

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

解:

您可以dynamicselect整数值:

 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); } }); 

还build议使用更多的解释性ID,如: buttonDoThisbuttonDoThat

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

您传递string而不是整数。

您正试图使用​​findViewById()和一个包含ID的variables名称的String。 Java不支持这种dynamicvariables名称,因为只有在编译时才知道variables名,而不是运行时。 你想做什么? 你需要find另一种方法来解决这个问题。 请进一步解释,我们可以提出build议。

如果您使用自己的layout.xml作为对话框,则需要首先对其进行膨胀,然后将视图指定给对话框构build器。

 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 } });