switch 语句只递增一次

switch statement only incrementing once

我正在为学校开发一个咖啡订购应用程序。我对下面代码的意图是根据是否单击 subtractCoffeeButton 或 addCoffeeButton 来增加或减少咖啡整数。 coffeeTV 用于向用户显示排队等待订购的咖啡的数量。 subtotal 和 subtotalTV 用于保存价格并显示给用户。

实际上,subtractCoffee 和 addCoffee 按钮用于将 coffee 和 coffeeTV 从 0 增加到 1,反之亦然,subtotal 和 subtotalTV 也用于显示 0.00 和 2.5,但它不会再增加更多.当预期将咖啡增加到 2、3、4 等时,进一步的按钮点击不会发生任何事情。小计为 5.00、7.50、10.00 等

代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

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

        Button subtractCoffee = (Button) findViewById(R.id.subtractCoffeeButton);
        subtractCoffee.setOnClickListener(this);

        Button addCoffee = (Button) findViewById(R.id.addCoffeeButton);
        addCoffee.setOnClickListener(this);

}



    @Override
    public void onClick(View v) {
    double subtotal = 0.00;

    int coffee = 0;


    double coffeePrice = 2.50;

    TextView coffeeTV = (TextView) findViewById(R.id.tvCoffeeOrder);
    String coffeeString = coffeeTV.getText().toString();
    int coffeeTracker = Integer.parseInt(coffeeString);

    TextView subTotalTV = (TextView) findViewById(R.id.tvSubtotalCost);


    switch (v.getId()) {
        case R.id.subtractCoffeeButton:
            if (coffeeTracker == 0) {
                break;
            } else if (coffeeTracker == 1) {
                coffee = 0;
                coffeeTracker = 0;
                coffeeTV.setText(Integer.toString(coffee));
                break;
            } else {
                coffee = coffee - 1;
                coffeeTV.setText(Integer.toString(coffee));
                subtotal = subtotal - coffeePrice;
                subTotalTV.setText(Double.toString(subtotal));
            }
            break;
        case R.id.addCoffeeButton:
            coffee += 1;
            coffeeTracker+=1;
            coffeeTV.setText(Integer.toString(coffee));
            subtotal = subtotal + coffeePrice;
            subTotalTV.setText(Double.toString(subtotal));
            break;
    }

}

因为

double subtotal = 0.00;
int coffee = 0;
double coffeePrice = 2.50;

在您的方法的本地范围内。声明为成员变量,只要当前 Activity 没有被销毁,它们的值就会一直存在

@Override
public void onClick(View v) {
double subtotal = 0.00;
int coffee = 0;
double coffeePrice = 2.50;

这些变量必须在 onClick 方法之外。 每次您调用 onClick 时,它们都会以 0 再次启动。

要么采用其他答案方法(字段变量),要么阅读并解析每个 onClick() 上的金额。在代码中它看起来像:

static final double COFFEE_PRICE = 2.50;

@Override
public void onClick(View v) {
    TextView coffeeTV = (TextView) findViewById(R.id.tvCoffeeOrder);
    String coffeeString = coffeeTV.getText().toString();
    int coffee = Integer.parseInt(coffeeString);

    TextView subtotalTV = (TextView) findViewById(R.id.tvSubtotalCost);
    String subtotalString = subtotalTV.getText().toString();
    double subtotal = Double.parseDouble(subtotalString);

    switch (v.getId()) {
        case R.id.subtractCoffeeButton:
            if (coffee == 0) {
                break;
            }
            coffee--;
            subtotal -= COFFEE_PRICE;
            coffeeTV.setText(Integer.toString(coffee));
            subtotalTV.setText(Double.toString(subtotal));
            break;
        case R.id.addCoffeeButton:
            coffee++;
            subtotal += COFFEE_PRICE;
            coffeeTV.setText(Integer.toString(coffee));
            subtotalTV.setText(Double.toString(subtotal));         
            break;
     }
}

正如已经说过的小计,coffe 和 coffePrice 需要在 onClick 函数之外。据我所知,coffeTracker 应该始终与 coffe 相同,因此您不需要变量

这应该是您的代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

        double subtotal = 0.00;
        int coffee = 0;
        double coffeePrice = 2.50;    

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

            Button subtractCoffee = (Button) findViewById(R.id.subtractCoffeeButton);
            subtractCoffee.setOnClickListener(this);

            Button addCoffee = (Button) findViewById(R.id.addCoffeeButton);
            addCoffee.setOnClickListener(this);

    }



        @Override
        public void onClick(View v) {

        TextView coffeeTV = (TextView) findViewById(R.id.tvCoffeeOrder);
        TextView subTotalTV = (TextView) findViewById(R.id.tvSubtotalCost);


        switch (v.getId()) {
            case R.id.subtractCoffeeButton:
                if (coffee == 0) {
                    break;
                } else if (coffee == 1) {
                    coffee = 0;
                    coffeeTV.setText(Integer.toString(coffee));
                    break;
                } else {
                    coffee = coffee - 1;
                    coffeeTV.setText(Integer.toString(coffee));
                    subtotal = subtotal - coffeePrice;
                    subTotalTV.setText(Double.toString(subtotal));
                }
                break;
            case R.id.addCoffeeButton:
                coffee += 1;
                coffeeTV.setText(Integer.toString(coffee));
                subtotal = subtotal + coffeePrice;
                subTotalTV.setText(Double.toString(subtotal));
                break;
        }

    }

问题是你有

double subtotal = 0.00;
int coffee = 0;

在 onClick() 函数的开头。因此,每次单击按钮时,都会将数字重置为 0,然后将其递增为 1。

此外,我建议您定义单独的 OnClickListener 而不是全局的。类似于:

public class MainActivity extends AppCompatActivity {

    AppWidgetManager appWidgetManager;
    SharedPreferences preferences;
    SharedPreferences.Editor editor;
    InputMethodManager inputMethodManager;

    EditText mainEditText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Fabric.with(this, new Crashlytics());
        setContentView(R.layout.activity_main);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            ActivityManager.TaskDescription taskDescription =
                    new ActivityManager.TaskDescription(null, null, getResources().getColor(R.color.primaryDark));
            setTaskDescription(taskDescription);
            getWindow().setNavigationBarColor(getResources().getColor(R.color.primary));
        }

        appWidgetManager = AppWidgetManager.getInstance(this);
        inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);

        preferences = PreferenceManager.getDefaultSharedPreferences(this);
        editor = preferences.edit();
        String savedText = preferences.getString("mainText", "");

        mainEditText = (EditText) findViewById(R.id.mainEditText);
        mainEditText.setMovementMethod(new ScrollAndSelectMovingMethod());
        mainEditText.getText().append(savedText);
        Selection.setSelection(mainEditText.getText(), savedText.length());

        mainEditText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                inputMethodManager.showSoftInput(mainEditText, InputMethodManager.SHOW_IMPLICIT);
            }
        });

        mainEditText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                onEditTextTextChanged(charSequence.toString());
            }

            @Override
            public void afterTextChanged(Editable editable) {
            }
        });
    }

    @Override
    public void onBackPressed() {
        finish();
    }

    private void onEditTextTextChanged(String text) {
        saveText(text);
        updateWidget();
    }

    private void saveText(String text) {
        editor.putString("mainText", text);
        editor.commit();
    }

    private void updateWidget() {
        int[] ids = appWidgetManager.getAppWidgetIds(new ComponentName(this, Widget.class));
        for (int id : ids)
            Widget.updateAppWidget(appWidgetManager, id);
    }
}