2015-11-26 2 views
0

Я делаю калькулятор, а ниже - мой код. Мне было интересно, есть ли способ сократить код, у меня есть 18 кнопок, и я должен написать 50 строк кода просто взять ссылку из XML и добавить нажмите слушающего к немуКак укоротить код

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 

String SelectedOpertator; 
int num1, num2, result; 

EditText input; 
Button b1, b2, b3, b4, b5, b6 ,b7, b8, b9, b0, bdot; 
Button bc, bs, bd, bp, bmi, bm, be; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    input = (EditText) findViewById(R.id.input); 

    b1 = (Button) findViewById(R.id.b1); 
    b2 = (Button) findViewById(R.id.b2); 
    b3 = (Button) findViewById(R.id.b3); 
    b4 = (Button) findViewById(R.id.b4); 
    b5 = (Button) findViewById(R.id.b5); 
    b6 = (Button) findViewById(R.id.b6); 
    b7 = (Button) findViewById(R.id.b7); 
    b8 = (Button) findViewById(R.id.b8); 
    b9 = (Button) findViewById(R.id.b9); 
    b0 = (Button) findViewById(R.id.b0); 
    bdot = (Button) findViewById(R.id.bdot); 

    bc = (Button) findViewById(R.id.bc); 
    bs = (Button) findViewById(R.id.bs); 
    bd = (Button) findViewById(R.id.bd); 
    bp = (Button) findViewById(R.id.bp); 
    bmi = (Button) findViewById(R.id.bmi); 
    bm = (Button) findViewById(R.id.bm); 
    be = (Button) findViewById(R.id.be); 

    b1.setOnClickListener(this); 
    b2.setOnClickListener(this); 
    b3.setOnClickListener(this); 
    b4.setOnClickListener(this); 
    b5.setOnClickListener(this); 
    b6.setOnClickListener(this); 
    b7.setOnClickListener(this); 
    b8.setOnClickListener(this); 
    b9.setOnClickListener(this); 
    b0.setOnClickListener(this); 
    bdot.setOnClickListener(this); 
    bc.setOnClickListener(this); 
    bs.setOnClickListener(this); 
    bd.setOnClickListener(this); 
    bp.setOnClickListener(this); 
    bmi.setOnClickListener(this); 
    bm.setOnClickListener(this); 
    be.setOnClickListener(this); 

} 

Есть ли другой способ напишите этот код короче?

+2

Я думаю, вы можете использовать петлю – Programmer

+0

Я так не думаю. Просто разделите эти findview и установите onclicklistener на некоторые методы для лучшего форматирования кода. –

ответ

3

Если добавить способ сделать то findViewById и setOnClickListener, вы можете уменьшить линии для каждой кнопки от 12:58:

private Button findAndSetClickListener(int id) { 
    Button button = (Button) findViewById(id); 
    button.setOnClickListener(this); 
    return button; 
} 

Тогда:

b1 = findAndSetClickListener(R.id.b1); 
// etc. 
1

попробуйте этот тип кода.

public class MainActivity extends AppCompatActivity implements  View.OnClickListener { 

String SelectedOpertator; 
int num1, num2, result; 

EditText input; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    input = (EditText) findViewById(R.id.input);  


    ((Button) findViewById(R.id.b1)).setOnClickListener(this); 
    ((Button) findViewById(R.id.b2)).setOnClickListener(this); 
    ((Button) findViewById(R.id.b3)).setOnClickListener(this); 
    ((Button) findViewById(R.id.b4)).setOnClickListener(this); 
    ((Button) findViewById(R.id.b5)).setOnClickListener(this); 
    ((Button) findViewById(R.id.b6)).setOnClickListener(this); 
    ((Button) findViewById(R.id.b7)).setOnClickListener(this); 
    ((Button) findViewById(R.id.b8)).setOnClickListener(this); 
    ((Button) findViewById(R.id.b9)).setOnClickListener(this); 
    ((Button) findViewById(R.id.b0)).setOnClickListener(this); 

    ((Button) findViewById(R.id.bdot)).setOnClickListener(this); 

    ((Button) findViewById(R.id.bc)).setOnClickListener(this); 
    ((Button) findViewById(R.id.bs)).setOnClickListener(this); 
    ((Button) findViewById(R.id.bp)).setOnClickListener(this); 
    ((Button) findViewById(R.id.bmi)).setOnClickListener(this); 
    ((Button) findViewById(R.id.bm)).setOnClickListener(this); 
    ((Button) findViewById(R.id.be)).setOnClickListener(this); 




} 
+0

Что именно вы пытаетесь показать здесь? Дампы кода без каких-либо объяснений не являются полезными. –

+0

Casting '((Button) findViewById (R.id.b1)). SetOnClickListener (this);' to 'Button' не требуется –

1

Вы можете написать массив, в котором хранятся представления.

Так что вы можете сделать что-то вроде

for (View v : array.getView()) { 
    v.setOnClickListener(this) 
} 

Я думаю, что фактическая findViewById будет немного сложнее, чтобы упростить

3
int ids[] = new int[] {R.id.b1, R.id.b2, R.id.b3, R.id.b4, R.id.b5, R.id.b6, R.id.b7, R.id.b8, R.id.b9, R.id.b0} 

for(int i = 0; i < ids.length, i += 1){ 
    findViewById(ids[i]).setOnClickListener(this); 
} 

Там нет необходимости для хранения ссылок на каждую кнопку как членов класса. В прослушивателе onClick мы можем определить, какая кнопка была нажата.

public onClick(View v){ 
    int number = Arrays.asList(ids).indexOf(v.getId()) + 1; 
    // Button 'number' was clicked 
} 
+1

Это предполагает, что ссылки на кнопки не требуются вне метода' onCreate'. –

+1

Это хорошо! Но разве он не потерял ссылку на эту кнопку? Что, если ему нужно вызвать какую-то другую функцию на кнопках? – Matteo

+0

Если вы хотите сохранить ссылку на кнопку, используйте ту же технику с кнопкой. 'Button [] buttons = new Button {b1, b2, ...};' и их в цикле добавить 'buttons [i] = (Button) findViewById (ids [i])'. – sonic

1

Вы могли бы сократить его примерно в 50% (и сделать его намного более читаемым) с частным способом:

private Button getButtonWithListener(int id) { 
    Button btn = (Button) findViewById(id); 
    btn.setOnClickListener(this); 
    return btn; 
} 

и называем это на каждой кнопке: (спасает вас setOnClickListener)

b1 = getButtonWithListener(R.id.b1); 
b2 = getButtonWithListener(R.id.b2); 
b3 = getButtonWithListener(R.id.b3); 
b4 = getButtonWithListener(R.id.b4); 
b5 = getButtonWithListener(R.id.b5); 
b6 = getButtonWithListener(R.id.b6); 
b7 = getButtonWithListener(R.id.b7); 
b8 = getButtonWithListener(R.id.b8); 
b9 = getButtonWithListener(R.id.b9); 
b0 = getButtonWithListener(R.id.b0); 
bdot = getButtonWithListener(R.id.bdot); 

bc = getButtonWithListener(R.id.bc); 
bs = getButtonWithListener(R.id.bs); 
bd = getButtonWithListener(R.id.bd); 
bp = getButtonWithListener(R.id.bp); 
bmi = getButtonWithListener(R.id.bmi); 
bm = getButtonWithListener(R.id.bm); 
be = getButtonWithListener(R.id.be); 

Таким образом, вы не теряете ссылку на кнопку. Если вам нужны эти ссылки на кнопки, это не станет намного короче. Если вы им не нужны, то в других ответах здесь есть отличные возможности!

1

Если вам необходимо сократить код кнопки, Использовать представление в OnClick() с помощью оператора switch.

в макете XML:

Создайте несколько кнопок, которые вы хотите с различным идентификатором кнопки. Но используйте одно и то же имя метода для атрибута onClick всех кнопок. Например:android: onClick = "submitBTN" Используется для всех кнопок.

В вашем MainActivity:

Реализовать это имя метода для выполнения различных операций при помощи переключателя ничего о

public void submitBTN(View view) { 
    switch (view.getId()) { 
     case R.id.btnClick1: // Code of button 1 Click 
      break; 
     case R.id.btnClick2: // Code of button 2 Click 
      break; 
     case R.id.btnClick3:  // Code of button 3 Click 
      break; 
     case R.id.btnClickn: // Code of Button n Click 
    } 
} 
1

Попробуйте использовать библиотеку масло нож.Вы можете использовать синтаксис как:

@Onclick({R.id.b1, R.id.b2...}) 
public void handleClick(Button btn){ 
     // handle click event here 
} 
Смежные вопросы