如何缩短代码

时间:2015-11-26 10:19:53

标签: java android

我正在制作计算器,下面是我的代码。我想知道是否有任何缩短代码的方法,我有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);

}

还有其他方法可以用更短的方式编写这段代码吗?

7 个答案:

答案 0 :(得分: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 :(得分:3)

如果您添加方法来执行findViewByIdsetOnClickListener,则可以将每个按钮的行数从两个减少为一个:

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

然后:

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

答案 2 :(得分: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);




}

答案 3 :(得分:1)

您可以编写一个存储视图的数组。

这样你就可以做一些像

这样的事情
*scanf()

我认为实际的[...]会更简单一些

答案 4 :(得分: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);

这样您就不会丢失对该按钮的引用。如果您需要对按钮的引用,它将不会变得更短。如果你不需要它们,那么其他答案中有一些很好的可能性!

答案 5 :(得分:1)

如果您需要缩短按钮代码,请在Switch语句的帮助下使用OnClick()中的View。

在您的XML布局中:

使用不同的按钮ID创建所需的按钮数。但是对于所有按钮的onClick属性使用相同的方法名称。 例如: android:onClick =&#34; submitBTN&#34; 用于所有按钮。

在您的MainActivity中:

使用switch语句

实现该方法名称以执行不同的操作
    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
    }
}

答案 6 :(得分:1)

尝试使用黄油刀库。您可以使用以下语法:

@Onclick({R.id.b1, R.id.b2...})
public void handleClick(Button  btn){
         // handle click event here
}