OnCheckedChangeListener& android中的OnClickListener - 按钮在第一次单击时半工作,在第二次单击时完成?

时间:2012-07-05 18:53:32

标签: android radio-button onclicklistener oncheckedchanged

嗯......这是一个问题,看起来我不是第一个体验其他问题的人,但我找不到一个特定于Android的(其他人是C ++或具有不同场景的直接java)。 / p>

我有一个计算器,可以根据给定的用户输入确定您的燃油里程需求。我现在添加的是一个“烧尽”的方面,你可以计算在比赛过程中损失的重量。在添加重量/燃尽元素之前,一切正常。

现在,除了第一次点击的重量 外,所有内容都会正常计算

在第二次点击(以及后续点击)时,它会正确计算。我怀疑它与switch语句及其位置有关,但我可能是错的......即使我不是,我也不确定如何改变它。

寻求帮助,让它在第一次点击时正常运行。谢谢!

编辑:我作为调试器放入的非异常Toast文本,用于确定它是数学问题还是代码中的问题。它在第一次点击时弹出“0.0”,然后在后续点击时弹出“6.2”或“6.6”。


    package com.tomcat.performance;

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


    public class Fuelsimple extends Activity implements OnCheckedChangeListener{

double fuelweight;

public void onCheckedChanged(RadioGroup group, int checkedId) {
    // TODO Auto-generated method stub
    switch (checkedId){
    case R.id.rbMethanol:
        fuelweight = 6.6;
        break;
    case R.id.rbGasoline:
        fuelweight = 6.2;
        break;}
}

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

RadioGroup rgFuelType = ((RadioGroup) findViewById (R.id.rgFuelType));
rgFuelType.setOnCheckedChangeListener(this);
RadioButton rbMethanol = ((RadioButton) findViewById(R.id.rbMethanol));
RadioButton rbGasoline = ((RadioButton) findViewById(R.id.rbGasoline));

Button gen = ((Button) findViewById(R.id.submit));  
gen.setOnClickListener(new View.OnClickListener() { 



        public void onClick(View v) {
    // TODO Auto-generated method stub      

            EditText fuelUsed, pracLaps, featureLaps;

            pracLaps = ((EditText) findViewById(R.id.pracLaps));
            fuelUsed = ((EditText) findViewById(R.id.fuelUsed));
            featureLaps = ((EditText) findViewById(R.id.featureLaps));
            TextView textLPGValue, textFuelNeededValue, textBurnoffValue;
            try{
            double pracLapsVar = Double.parseDouble(pracLaps.getText().toString());
            double fuelUsedVar = Double.parseDouble(fuelUsed.getText().toString());
            double featureLapsVar = Double.parseDouble(featureLaps.getText().toString());

            double efficiency = (pracLapsVar / fuelUsedVar);
            double fuelNeeded = (featureLapsVar / efficiency);
            double burnoff = (1.05 * (fuelNeeded * fuelweight));

            Toast andJelly = Toast.makeText(Fuelsimple.this, String.valueOf(fuelweight), Toast.LENGTH_LONG);
            andJelly.show();


            textLPGValue = ((TextView) findViewById(R.id.textLPGValue));
            textFuelNeededValue = ((TextView) findViewById(R.id.textFuelNeededValue));
            textBurnoffValue = ((TextView) findViewById(R.id.textBurnoffValue));

            textLPGValue.setText(String.valueOf(String.format("%.3f", efficiency)) + " laps per gallon");
            textFuelNeededValue.setText(String.valueOf(String.format("%.3f", fuelNeeded)) + " gallons");
            textBurnoffValue.setText(String.valueOf(String.format("%.2f", burnoff)) + " pounds");
            } catch (NumberFormatException e) {Toast andEggs = Toast.makeText(Fuelsimple.this, "Please complete all fields and enter your fuel & lap info in decimals or whole numbers.", Toast.LENGTH_LONG); andEggs.show();} 
            catch (NullPointerException n) {Toast andEggs = Toast.makeText(Fuelsimple.this, "Please enter ALL lap and fuel data.", Toast.LENGTH_LONG);
            andEggs.show();}
        }}
);      
}
    public void onClick(View v) {
    }
    }

2 个答案:

答案 0 :(得分:3)

据我所知,在按下单选按钮之前,你的变量fuelWeight永远不会被初始化。解决这个问题的最简单方法是在设置监听器之后在rbmethanol或rbGasoline 上调用setChecked(true),也就是在初始化这些变量的正下方。在设置侦听器之后执行此操作非常重要,因为您希望解析switch语句。现在,在按下单选按钮之前,fuelWeight与所有数字原始数据类型一样,将初始化为0.这可能是您第一次计算错误的原因。

答案 1 :(得分:1)

您还可以查看CheckChangeListener。只要检查状态发生变化,就会调用它。

cbSave.setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                int visibility = isChecked ? View.VISIBLE : View.GONE;
                findViewById(R.id.nameInstructions).setVisibility(visibility);
                findViewById(R.id.name).setVisibility(visibility);

}