Почему я не могу получить эти расчеты для отображения в текстовом представлении? - PullRequest
1 голос
/ 04 января 2012

Я пытаюсь создать приложение, которое преобразует расстояние / площадь / объем, используя счетчики в качестве метода выбора единиц измерения. Предполагается, что вычисления выполняются, а затем выходные данные отправляются в текстовое представление на основе того, что введено в EditText. Но на выходе всегда только 0,0 и ничего больше. Кто-нибудь может помочь с этим?

spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
            switch(pos){
            case 0:         
                option1.setAdapter(length);
                option2.setAdapter(length);
                return;
            case 1:         
                option1.setAdapter(area);
                option2.setAdapter(area);
                return;
            default:
        }           
    }

        public void onNothingSelected(AdapterView<?> parent) {
          // Do nothing.
        }
    });

    option1.setOnItemSelectedListener(new OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
            if(pos>=0) {
                stringInput = edittext1.getText().toString();
                if(stringInput == null || stringInput.isEmpty()) {
                    doubleInput = 0.0;
                }
                else {
                    doubleInput = Double.parseDouble(edittext1.getText().toString());
                }                                   
            }                               
        }

        public void onNothingSelected(AdapterView<?> parent) {
          // Do nothing.
        }
    });     

    option2.setOnItemSelectedListener(new OnItemSelectedListener() {
        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
            switch(pos) {
            case 0:
                miles = doubleInput * 1;
                textview1.setText("" + String.valueOf(miles));
                return;
            case 1:
                km = doubleInput * 1.609344;
                textview1.setText("" + String.valueOf(km));
                return;
            default:
            }

        }

        public void onNothingSelected(AdapterView<?> parent) {
          // Do nothing.
        }
    });

Ответы [ 2 ]

1 голос
/ 05 января 2012

С риском звучать как настоящий старик, это похоже на твою домашнюю работу в колледже ... Так ли это?

Ваш код изменился с тех пор, как задал вопрос, что затрудняет ответ!К счастью, мне удалось скрести ваш код в Eclipse до того, как вы его изменили ... Во всяком случае, в исходном коде вы выполняли все свои операции в методе create, и в этот момент вы не ввели значение для edittext1 (если не установлено какое-либо значение).разумное значение по умолчанию, которое, как я полагаю, будет 0, следовательно, всегда получая ноль в качестве вашего ответа?)

    // Whilst setting up a view the create method will not have a 
    // reasonable value for edittext1 - or it will be your default
    String stringInput = (edittext1.getText().toString());
if (stringInput.isEmpty()) { 
    doubleInput = 0.0;    // Will always enter this line
} else {
    doubleInput = Double.parseDouble(edittext1.getText().toString());
}

Вы продублировали код ...

output1 = (TextView) findViewById(R.id.output1);

На самом деле вывод от 1 доoutput10 (т.е. все десять строк) дублируются.

Что касается обновленного кода, это все еще вызывает проблемы?Вы уверены, что stringInput имеет значение?Я имею в виду, вы что-то набрали?Вы можете проверить это путем отладки вашей программы.

Следующее также подвержено ошибкам, как предполагает FloatingCoder, и может привести к поломке ...

doubleInput = Double.parseDouble(edittext1.getText().toString());

Лучший способ сделать это (потому чтоон ловит исключение, которое может выдавать Java)

doubleInput = 0.0;
String inputStr = question.getText().toString();
try {
    doubleInput = Double.parseDouble(inputStr);
} catch (NumberFormatException e) {
    // This should probably do something more useful? i.e. tell
    // the user what they've done wrong...
    Log.e("Android",
                    "Double throws a NumberFormatException if you enter text that is not a number");
}

О, а в Android есть несколько вспомогательных утилит для проверки строк, см. TextUtils или просто мой пример ...

if (!TextUtils.isEmpty(inputStr)) { // checks for "" and null (see documentation)
      doubleInput = Double.parseDouble(inputStr);
}

IНАСТОЯТЕЛЬНО рекомендую написать простой контрольный пример для вычисления, которое выглядит неверно, потому что два текстовых поля и кнопка действительно не сложны, и их очень легко отлаживать без необходимости мешать всем счетчикам.Во всяком случае, надеюсь, что это помогло, о, и мой полный пример с двумя edittexts и кнопкой, я просто опубликую это здесь ... Надеюсь, это поможет ...

private Button btnCalc;
private EditText question, answer;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    answer = (EditText) findViewById(R.id.answer);
    question = (EditText) findViewById(R.id.question);
    btnCalc = (Button) findViewById(R.id.btnCalc);
            // The OnClickListener here will be executed outside the "Create",
            // i.e., when you actually click on the button, which will give you
            // a chance to enter some values in the question edittext...
    btnCalc.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            double in = 0.0;
            try {
                String inputStr = question.getText().toString();

                // if you want to check it use
                if (!TextUtils.isEmpty(inputStr)) {
                    in = Double.parseDouble(inputStr);
                }
            } catch (NumberFormatException e) {
                // This should probably do something more useful? i.e. tell
                // the user what they've done wrong...
                Log.e("Android",
                        "Double throws a NumberFormatException if you enter text that is not a number");
            }

            double miles = in * 1.6;
            answer.setText(String.valueOf(miles));
        }
    });
}
0 голосов
/ 04 января 2012

Сложно сказать по коду, который вы разместили, но я предполагаю, что вы устанавливаете doubleInput, когда выбран вариант 1. Если вы вводите число после выбора варианта 1, оно всегда будет равно 0,0, так как число не было в текстовой области при замене счетчика.

Используйте отладчик, чтобы пройти по коду и посмотреть, достигнете ли вы когда-либо строки

doubleInput = Double.parseDouble(edittext1.getText().toString());

и для проверки правильности установки номера в этой точке.

...