0

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

4 回答 4

1

由于这段代码似乎只OnClickListener为所有Buttons 设置了一个,因此您可以做的是在 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;
       ...
}

你这样做的方式很好,但这是我更喜欢处理这种情况的方式。您只需Buttons在 xml 中提供所有相同的函数名称,然后使用该名称作为 Java 中的函数名称。您还必须确保使用void返回类型声明函数,并确保它将 aView作为其唯一的参数,如我的示例中所示。

Button Docs 也有一个例子

于 2013-07-23T13:49:23.787 回答
1

在您的布局文件中将其添加到每个按钮

 <Button
   ...
   android:onClick="btnClicked"
   .../>

然后在您的代码中添加此方法并检查此方法中的每个按钮

public void btnClicked(View v)
{
   switch(v.getId())
   {
      case R.id.BtnNum0:
      // your code
      break;
      ....
   }
}
于 2013-07-23T13:50:11.200 回答
0

正如 trevor-e 建议的那样,您可以尝试使用注释处理器。Android Annotations可以将您的代码简化为:

@Click
public void BtnNum0() {
    // Button 0 clicked
}
@Click
public void BtnNum1() {
    // Button 1 clicked
}
// etc.

如果你走这条路,请尝试使用遵循 Java 约定的名称,因为按钮名称与函数名称相对应。

于 2013-07-23T13:52:27.293 回答
0

不幸的是,这可能是最好的解决方案,除非您使用某种注释框架,但它仍然不会在样板上减少太多。

编辑:

您可以尝试获取指向持有 Button 视图的任何 ViewGroup 的指针,然后获取其所有子视图,然后在将它们投射到 Button 时循环它们。

例如:如果 XML 中的 Button 对象位于 LinearLayout 中,则可以获取指向该对象的指针并执行以下操作:

for(int i=0; i < ((ViewGroup)v).getChildCount(); ++i) {
    Button nextChild = (Button) ((ViewGroup)v).getChildAt(i);
}

当然,我不建议这样做,但这仍然是一种可能性。

于 2013-07-23T13:48:35.187 回答