Android计算器按钮

时间:2013-07-23 13:45:02

标签: android button android-button

我正在尝试为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
};

我一直在寻找答案,但我仍然无法找到解决方案。

4 个答案:

答案 0 :(得分:1)

你可以做什么,因为这段代码似乎只为所有OnClickListener设置了一个Button,就是在xml中做到这一点

对于每个Button

android:onClick="functionName"

然后在您的代码中,您可以取消所有id'sfor 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作为其唯一参数,如我的示例所示。

The Button Docs also have an example of this

答案 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约定的名称,因为按钮名称与功能名称相对应。