我正在尝试为Android制作计算器。这是我的按钮的代码:
int[] button_ids = {
R.id.BtnNum0, R.id.BtnNum1, R.id.BtnNum2, R.id.BtnNum3, R.id.BtnNum4, R.id.BtnNum5, R.id.BtnNum6,
R.id.BtnNum7, R.id.BtnNum8, R.id.BtnNum9, R.id.BtnAdd, R.id.BtnSub, R.id.BtnDiv, R.id.BtnMult,
R.id.BtnClear, R.id.equals
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditTextValue = (EditText) findViewById(R.id.editText1);
TVValue = (TextView) findViewById(R.id.textView1);
buttons = new ArrayList<Button>();
for(int id : button_ids) {
Button button = (Button)findViewById(id);
button.setOnClickListener(this);
buttons.add(button);
}
}
如何将此部分更改为代码块,我不必声明按钮的ID? (例如R.id.BtnNum0
)
int[] button_ids = {
R.id.BtnNum0, R.id.BtnNum1, R.id.BtnNum2, R.id.BtnNum3, R.id.BtnNum4, R.id.BtnNum5, R.id.BtnNum6,
R.id.BtnNum7, R.id.BtnNum8, R.id.BtnNum9, R.id.BtnAdd, R.id.BtnSub, R.id.BtnDiv, R.id.BtnMult,
R.id.BtnClear, R.id.equals
};
我一直在寻找答案,但我仍然无法找到解决方案。
答案 0 :(得分:1)
你可以做什么,因为这段代码似乎只为所有OnClickListener
设置了一个Button
,就是在xml中做到这一点
对于每个Button
集
android:onClick="functionName"
然后在您的代码中,您可以取消所有id's
和for loop
。在Java中只需创建一个像
public void functionName(View v)
{
switch (v.getId())
{
case R.id.buttonId:
// do work for this Button
break;
...
}
你这样做的方式很好,但这是我更喜欢处理这种情况的方式。您只需要在xml中为所有Buttons
提供相同的函数名称,然后在Java中将该名称用作函数名称。您还必须确保使用void
返回类型声明该函数,并确保它将View
作为其唯一参数,如我的示例所示。
答案 1 :(得分:1)
将此添加到每个按钮
<Button
...
android:onClick="btnClicked"
.../>
然后在您的代码中添加此方法并检查此方法中的每个按钮
public void btnClicked(View v)
{
switch(v.getId())
{
case R.id.BtnNum0:
// your code
break;
....
}
}
答案 2 :(得分:0)
不幸的是,这可能是最好的解决方案,除非你使用某种类型的注释框架仍然不会在样板上减少很多。
修改强>
你可以尝试获取指向ViewGroup持有Button视图然后获取所有子节点的指针,然后在将它们转换为Buttons时循环遍历它们。
例如:如果XML中的Button对象位于LinearLayout中,您可以获得指向它的指针,并执行以下操作:
for(int i=0; i < ((ViewGroup)v).getChildCount(); ++i) {
Button nextChild = (Button) ((ViewGroup)v).getChildAt(i);
}
当然,我建议不要这样做,但仍有可能。
答案 3 :(得分:0)
正如trevor-e建议的那样,您可以尝试使用注释处理器。 Android Annotations可以将您的代码简化为:
@Click
public void BtnNum0() {
// Button 0 clicked
}
@Click
public void BtnNum1() {
// Button 1 clicked
}
// etc.
如果你选择这条路线,请尝试使用符合Java约定的名称,因为按钮名称与功能名称相对应。