Почему целые числа, отправляемые из одного Android-приложения Activity в другое, вызывают сбой моего приложения? - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть кнопка [DONE], которая должна проверять результаты 2 записей.Одним из них является [EditText - inputType: number], а другим - [TextView], который увеличивается при нажатии определенной кнопки.

То, что я пытаюсь сделать, это проверить, имеет ли EditText целое число или равно нулю, и проверить содержимое TextView.если они оба больше нуля.Я складываю их и отправляю итоги своей основной деятельности.Вот код, который у меня есть.

    public void returnbtn(View view) {

    // Initialize insert textView
    EditText insertcountBtn = findViewById(R.id.insertPushup);

    // Initialize counter textView
    TextView givencountBtn = findViewById(R.id.showCount);

    // get added int stuff from the insert textField
    int insertcountInt = 
    Integer.parseInt(insertcountBtn.getText().toString());

    // get string stuff from counter textView
    String givencountString = givencountBtn.getText().toString();

    // convert counter textView to int.
    Integer givencountInt = Integer.parseInt(givencountString);

    if (givencountInt <= 0 && insertcountInt <= 0){
        Total = 0;
    }  else if (givencountInt > 0 && insertcountInt <= 0) {

        Total = givencountInt;
    } else if (givencountInt <= 0 && insertcountInt > 0) {
        Total = insertcountInt;
    } else if (givencountInt > 0 && insertcountInt > 0){
        // Add Counter textView and Insert textView to an Int Total
        Total = givencountInt + insertcountInt;
    }

    // Create an Intent to return to the mainActivity.
    Intent beginPushup = new Intent(this, MainActivity.class);

    // Pass the current number to the push-up Counter activity.
    beginPushup.putExtra(TOTAL_DONE, Total);

    // Start mainActivity.
    startActivity(beginPushup);

}

У меня проблема с textView или EditText, я не уверен.Все, что я знаю, это то, что, если я заполняю их оба и нажимаю «Готово», они складываются и переводят итоговое значение в mainActivity, как и ожидалось.Если я добавляю значения в EditText и оставляю TextView с 0, он также делает то, что должен.Но если я увеличиваю TextView и оставляю EditText пустым, он не передает мое целое число TextView и вылетает из приложения.

Могу ли я обнаружить текст редактирования неправильно, потому что я думаю, что это причина.Если да, то какой путь правильный?с чем-то, я не получаю свой Integer в mainActivity.Это становится интересным.* Я думаю, что это игра утверждений if, которые я реструктурирую, но пока не повезло.*

----- Обновленный рабочий код для любых будущих запросов -----

public void filledChecker() {

    // Initialize insert textView
    EditText insertcountBtn = 
    findViewById(R.id.insertPushup);

    // Initialize counter textView
    TextView givencountBtn = findViewById(R.id.showCount);

    int insertcountInt = 0;
    int givencountInt = 0;

    // get added int stuff from the insert textField
    if (!TextUtils.isEmpty(insertcountBtn.getText()) && 
    TextUtils.isDigitsOnly(insertcountBtn.getText())) {
        insertcountInt = 
    Integer.parseInt(insertcountBtn.getText().toString());
    }

    // get string stuff from counter textView
    String givencountString = givencountBtn.getText().toString();
    if (!TextUtils.isEmpty(givencountString) && 
    TextUtils.isDigitsOnly(givencountString)) {
        givencountInt = Integer.parseInt(givencountString);
    }

    if (insertcountInt <= 0) {
        Total = givencountInt;
    }
    if (insertcountInt > 0) {
        Total = givencountInt + insertcountInt;
    }

}

public void returnbtn(View view) {
    // Create an Intent to return to the mainActivity.
    Intent beginPushup = new Intent(this, MainActivity.class);
    filledChecker();
    Integer current_Id = getIntent().getIntExtra(GIVEN_ID, 0);

    // Pass the current number to the push-up Counter activity.
    if (current_Id == 1) beginPushup.putExtra(TOTAL_P_DONE,     
    Total);
    if (current_Id == 2) beginPushup.putExtra(TOTAL_S_DONE,     
    Total);
    if (current_Id == 3) beginPushup.putExtra(TOTAL_C_DONE,     
    Total);
    if (current_Id == 4) beginPushup.putExtra(TOTAL_SQ_DONE,    
    Total);
    beginPushup.putExtra(GIVEN_ID, current_Id);

    // Start mainActivity.
    startActivity(beginPushup);
}

I Как вы можете видеть, я в конечном итоге отделил логику if от Намерения наПереход к основному виду деятельности.Таким образом, они оба просты.И используя «Не повторять себя», я сделал то же самое с остальными моими другими кнопками, как вы можете видеть со всеми if в методе [returnbtn].Я также упростил утверждение if помимо тех, с которыми мне помогли.Я закончил тем, что нуждался в 2 операторах if, чтобы получить общее количество от 2 записей.Еще раз спасибо за помощь всем.Ох, попытка - кроме как не кажется необходимым, поэтому я не одобряю их.по мере усложнения приложения я буду добавлять их при необходимости.

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Проблема здесь в том, что вы определяете editText для проверки только интергера: вы не поместили условный оператор для случаев, например, если была введена строка, если editText пуст, он содержит строку. Следовательно, вы можете захотеть поставить что-то вроде;

String editTextString = String.valueOf(insertcountBtn.getText());
if (editTextString == "") {
    //do something
}

С другой стороны,

String editTextString = insertcountBtn.getText().toString();
if (editTextString == "") {
//do something
}
0 голосов
/ 17 сентября 2018

Как объясняется в другом ответе, проблема с вашим кодом заключается в том, что когда поле EditText пустое, синтаксический анализ "null" вызывает исключение.Так что вам просто нужно убедиться, что если содержимое равно нулю, просто используйте значение 0 (ноль).
Вы можете попробовать это:

public void returnbtn(View view) {

// Initialize insert textView
EditText insertcountBtn = findViewById(R.id.insertPushup);

// Initialize counter textView
TextView givencountBtn = findViewById(R.id.showCount);

int insertcountInt = 0;
int givencountInt = 0;

// get added int stuff from the insert textField
if (!TextUtils.isEmpty(insertcountBtn.getText()) && TextUtils.isDigitsOnly(insertcountBtn.getText())) {
    insertcountInt = Integer.parseInt(insertcountBtn.getText().toString());
}

// get string stuff from counter textView
String givencountString = givencountBtn.getText().toString();
if (!TextUtils.isEmpty(givencountString) && TextUtils.isDigitsOnly(givencountString)) {
    givencountInt = Integer.parseInt(givencountString);
}

if (givencountInt <= 0 && insertcountInt <= 0){
    Total = 0;
}  else if (givencountInt > 0 && insertcountInt <= 0) {

    Total = givencountInt;
} else if (givencountInt <= 0 && insertcountInt > 0) {
    Total = insertcountInt;
} else if (givencountInt > 0 && insertcountInt > 0){
    // Add Counter textView and Insert textView to an Int Total
    Total = givencountInt + insertcountInt;
}

// Create an Intent to return to the mainActivity.
Intent beginPushup = new Intent(this, MainActivity.class);

// Pass the current number to the push-up Counter activity.
beginPushup.putExtra(TOTAL_DONE, Total);

// Start mainActivity.
startActivity(beginPushup);
}


TextUtils - это класс, предоставляемыйв Android Framework.
Это будет проверять, не является ли содержимое не пустым, а также только цифры.Очевидно, что вы можете пропустить проверку цифр, если уверены, что вводом вашего текста редактирования будет только число.

0 голосов
/ 17 сентября 2018

Потому что когда ваш EditText пуст, он не имеет числового значения.

Вы можете сделать

Integer.parseInt(insertcountBtn.getText().toString());

когда ввод пуст; там нет целочисленного значения, потому что там вообще ничего нет, поэтому он сгенерирует NumberFormatException.

Вы можете сделать следующее, чтобы убедиться, что оно имеет значение (по умолчанию будет 0 при ошибке):

int insertedcountInt;

try {
    insertedCountInt = Integer.parseInt(insertcountBtn.getText().toString());
} catch (NumberFormatException e) {
    insertedCountInt = 0;
}
...