#android #button
#Android #кнопка
Вопрос:
Итак, я пытаюсь создать калькулятор (первое приложение), но вместо того, чтобы настраивать каждую кнопку отдельно, можно ли сделать их все сразу?
вот как это настраивается сейчас:
final Button button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (decimal == true) {
String onScr = String.valueOf(firstTextView.getText());
onScr = onScr 1;
firstTextView.setText(onScr);
CurrentVal = 0.1;
}
else {
if (CurrentVal == 0) {
firstTextView.setText("1");
CurrentVal ;
} else {
String onScr = String.valueOf(firstTextView.getText());
onScr = onScr 1;
firstTextView.setText(onScr);
}
}
}
});
Мне удалось заставить его работать, но я хочу сжать код.
Ответ №1:
public class MainActivity extends Activity implements OnClickListener {
Button Btn1, Btn2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
Btn1 = (Button) findViewById(R.id.btn1);
Btn2 = (Button) findViewById(R.id.btn2);
Btn1.setOnClickListener(this);
Btn2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1:
Log.i("myTag", "Button1 Clicked");
break;
case R.id.btn2:
Log.i("myTag", "Button2 Clicked");
break;
}
}
Комментарии:
1. Вы не можете объявлять члены вне области видимости класса.
Ответ №2:
Вы можете implement View.OnClickListener
ввести свой Activity
(или Fragment
), а затем передать его как свой Listener
при настройке Buttons
.
Это позволит вам сжать код обработки кликов и очистить часть назначения кнопок. Гораздо более аккуратный код и проще в обслуживании.
public class MyActivity extends Activity implements View.OnClickListener
{
private Button button1;
private Button button2;
@Override
public void onCreate(Bundle b)
{
super.onCreate(b);
setContentView(R.layout.your_layout);
button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
// since your Activity implements View.OnClickListener
// you can pass it as an argument here.
button1.setOnClickListener(this)
button2.setOnClickListener(this)
}
@Override
public void onClick(View v)
{
// get the clicked view's Id and act accordingly
switch (v.getId())
{
case R.id.button1:
clickedButton1();
break;
case R.id.button2:
clickedButton2();
break;
// if you didn't set up a 'case' for a received click, log it
default:
Log.e(TAG, "Unhandled button press!");
break;
}
}
// if your code is moderately long you can
// move it outside of your onClick() too
private void clickedButton1()
{
// do something
}
private void clickedButton2()
{
// do something else
}
}
Ответ №3:
Вот как я это делаю. Это не совсем то, что вы просили, но вы можете изменить его в соответствии с вашими потребностями. Он работает с цифровыми кнопками. Вам нужно написать больше onClickListeners для других кнопок. Здесь resultString — это EditText.
private ArrayList<Integer> calculatorButtonList;
calculatorButtonList = new ArrayList<Integer>();
calculatorButtonList.add(R.id.button0);
calculatorButtonList.add(R.id.button1);
calculatorButtonList.add(R.id.button2);
calculatorButtonList.add(R.id.button3);
calculatorButtonList.add(R.id.button4);
calculatorButtonList.add(R.id.button5);
calculatorButtonList.add(R.id.button6);
calculatorButtonList.add(R.id.button7);
calculatorButtonList.add(R.id.button8);
calculatorButtonList.add(R.id.button9);
for(int i=0; i<calculatorButtonList.size(); i ) {
final String buttonText = ((Button) findViewById(calculatorButtonList.get(i))).getText().toString();
((Button) findViewById(calculatorButtonList.get(i))).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
resultString.setText(resultString.getText().append(buttonText));
resultString.setSelection(pairingKey.getText().length());
}
});
}