Базовый андроид: синтаксис для оператора switch вместо else-if - PullRequest
3 голосов
/ 20 июня 2011

Я работаю над учебником для начинающих по Android, который является калькулятором чаевых. Он работает правильно, но мне было интересно, как заменить оператор else-if на оператор switch. Не то чтобы это было так важно для целей этой программы, но я просто пытаюсь обдумать синтаксис.

package com.android.tipcalc;

import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Button;
import android.widget.RadioButton;
import android.view.View;

public class tipcalc extends Activity
{

    private EditText txtbillamount;
    private EditText txtpeople;
    private RadioGroup radiopercentage;
    private RadioButton radio15;
    private RadioButton radio18;
    private RadioButton radio20;

    private TextView txtperperson;
    private TextView txttipamount;
    private TextView txttotal;

    private Button btncalculate;
    private Button btnreset;

    private double billamount = 0;
    private double percentage = 0;
    private double numofpeople = 0; 
    private double tipamount = 0;
    private double totaltopay = 0;
    private double perperson = 0; 


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        initControls();

    }

    private void initControls()
    {
        txtbillamount = (EditText)findViewById(R.id.txtbillamount);
        txtpeople = (EditText)findViewById(R.id.txtpeople);
        radiopercentage = (RadioGroup)findViewById(R.id.radiopercentage);
        radio15 = (RadioButton)findViewById(R.id.radio15);
        radio18 = (RadioButton)findViewById(R.id.radio18);
        radio20 = (RadioButton)findViewById(R.id.radio20);
        txttipamount=(TextView)findViewById(R.id.txttipamount);
        txttotal=(TextView)findViewById(R.id.txttotal);
        txtperperson=(TextView)findViewById(R.id.txtperperson);

        btncalculate = (Button)findViewById(R.id.btncalculate);
        btnreset = (Button)findViewById(R.id.btnreset);

        btncalculate.setOnClickListener(new Button.OnClickListener() {
            public void onClick (View v){ calculate(); }});
        btnreset.setOnClickListener(new Button.OnClickListener() {
            public void onClick (View v){ reset(); }});

    }

    private void calculate()
    {
    billamount=Double.parseDouble(txtbillamount.getText().toString());
    numofpeople=Double.parseDouble(txtpeople.getText().toString());

    if (radio15.isChecked()) {
        percentage = 15.00;
    } else if (radio18.isChecked()) {
        percentage = 18.00;
    } else if (radio20.isChecked()) {
        percentage = 20.00;
    }

    tipamount=(billamount*percentage)/100;
    totaltopay=billamount+tipamount;
    perperson=totaltopay/numofpeople;

    txttipamount.setText(Double.toString(tipamount));
    txttotal.setText(Double.toString(totaltopay));
    txtperperson.setText(Double.toString(perperson));        
    }

    private void reset()
    {
    txtbillamount.setText("");
    txtpeople.setText("");
    radiopercentage.clearCheck();
    radiopercentage.check(R.id.radio15);
    txttipamount.setText("...");
    txttotal.setText("...");
    txtperperson.setText("...");
    }
}

Ответы [ 3 ]

5 голосов
/ 20 июня 2011

То, что люди выше меня сказали, правильно, но ради использования оператора switch для этого, вы могли бы установить OnCheckedChangedListener на RadioGroup, а затем использовать такой класс:

private class MyCheckedChangedListener implements OnCheckedChangeListener {

@Override
public void onCheckedChanged( RadioGroup group, int checkedId ) {

    switch (checkedId) {
        case R.id.radio15:
            percentage = 15f;
            break;
        case R.id.radio18:
            percentage = 18f;
            break;
        case R.id.radio20:
            percentage = 20f;
            break;
    }
}

}

1 голос
/ 20 июня 2011

A switch используется для одной переменной - т.е. у вас есть x, которая может равняться 3,5 или 7. Затем вы switch x и приводите несколько случаев - что делать с каждым возможным значениемиметь случай по умолчанию, когда ни одно из заданных значений не совпадает).В вашем случае вы проверяете несколько разных переменных, поэтому if ... else if ... else является правильным методом.Конечно, вы можете настроить радиоблоки для установки общей переменной, которую затем вы можете switch.

0 голосов
/ 20 июня 2011

Если вы говорите об операторах if-else в calculate(), вы не можете заменить его непосредственно на оператор switch.Значения регистра в операторе switch должны быть константами времени компиляции (целые или перечисляемые значения).Кроме того, if-else здесь прекрасно отражает логику того, что вы пытаетесь сделать.

Вы могли бы вычислить «тестовое значение переключения» на основе состояний radio15, radio18 иradio20 (скажем, целое число от 0 до 8, основанное на восьми возможных комбинациях значений) и включите его, но я настоятельно рекомендую против такого подхода.Мало того, что это излишне усложнит и затуманивает логику происходящего, вы будете проклинать себя, если будете нуждаться в поддержке кода через шесть месяцев после того, как забудете хитрый трюк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...