2013-07-23 134 views
0

我想为Android做一个计算器。这里是我的按钮代码: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 
}; 

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

+2

我不认为这是可能的。首先,R.id变量的值将由编译器生成,您只需通过id值访问它们。 – midhunhk

+1

我其实认为这是处理这个问题的一个很好的方法。你没有代码重复,并明确了应该使用onClickListener的按钮。 –

+2

如果你真的不想声明所有的按钮ID,你总是可以在循环中而不是在你的XML中以编程方式创建按钮。 – chancea

回答

1

你能做什么,因为这个代码,似乎只为所有Button个单OnClickListener,就是要做到在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作为其唯一参数,如我的示例中所示。

The Button Docs also have an example of this

+0

嗨。我有关于此代码的后续问题。我是否可以为案例提供替代代码,因此,不是每个按钮都使用“R.id.buttonId”,而是代码块将标识哪个按钮被按下? – asepdf

+0

我不确定你的意思。这就是你如何识别哪些被按下的。 'v.getId()'获得被按下的'Button'的'id' – codeMagic

0

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

编辑:

你可以试着得到一个指向任何ViewGroup中被按住按钮的意见,然后让所有的孩子,然后通过他们循环,同时他们铸造的按钮,当您去。

例如:如果XML你的按钮对象都装在一个LinearLayout中,你可以得到的指针是,做这样的事情:

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

当然,我建议不要这样,但它是仍然有可能。

1
在布局文件

它添加到每个按钮

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

然后在代码中添加此方法,在这种方法

public void btnClicked(View v) 
{ 
    switch(v.getId()) 
    { 
     case R.id.BtnNum0: 
     // your code 
     break; 
     .... 
    } 
} 
0

检查每个按钮作为trevor- e建议,你可以尝试给一个注释处理器。 Android Annotations可以简化您的代码:

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

如果你走这条路线,请不要尝试为按钮名称与功能名称对应于使用Java约定下列名称。