2013-07-23 2 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); 
    } 

} 

Как я могу изменить эту часть блока кода, где у меня не будет объявлять идентификаторы кнопок? (Например 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

Если вы действительно не хотите объявлять все идентификаторы кнопок, вы всегда можете просто создавать кнопки программно в цикле, а не в вашем XML. – chancea

ответ

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; 
     ... 
} 

, как вы делаете это хорошо, но это, как я предпочитаю, чтобы справиться с этой ситуацией. Вам просто нужно предоставить все Buttons такое же имя функции в xml, а затем использовать это имя в качестве имени вашей функции в Java. Вы также должны быть уверены, что объявите функцию с возвращаемым типом void и убедитесь, что он принимает View как свой единственный параметр, как в моем примере.

The Button Docs also have an example of this

+0

Привет. У меня есть следующий вопрос относительно этого кода. Могу ли я заменить код для случаев, поэтому вместо использования «R.id.buttonId» для каждой кнопки блок кода, который будет определять, какая кнопка была нажата? – asepdf

+0

Я не уверен, что вы имеете в виду. Вот как вы определяете, что было нажато. 'v.getId()' получает 'id' кнопки' Button', которая была нажата – codeMagic

0

Это, скорее всего, лучшее решение, к сожалению, если вы не используете какой-то аннотационный фреймворк, который по-прежнему не сильно сокращает шаблон.

редактировать:

Вы могли бы попытаться получить указатель на то, что ViewGroup держит точку Button, а затем получить всех своих детей, а затем цикл через них в то время как литье их к кнопкам, как вы идете.

Например: Если ваши объекты Button в 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- Предположим, вы можете попробовать обработчик аннотации. Android Annotations может упростить код:

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

Если вы идете по этому пути, пожалуйста, попробуйте использовать имена после конвенции Java в качестве названия кнопок соответствуют именам функций.

Смежные вопросы