找到按钮时遇到问题。我有一个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);
答案 0 :(得分:3)
在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,例如:buttonDoThis
,buttonDoThat
。
答案 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
}
});