2013-07-23 135 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約定下列名稱。