Как рассчитать единственные EditTexts, которые набраны? - PullRequest
0 голосов
/ 06 марта 2020

Хорошо, поэтому я пытаюсь создать очень простое приложение, которое позволит мне вычислить среднее значение 8 EditTexts, теперь я хочу, чтобы оно не обрабатывало sh, а вычисляло только EditTexts с набранными числами всякий раз, когда есть только 7 или меньше EditTexts, которые набраны. Я пытался сделать это с условием If, но всякий раз, когда я намеренно не заполняю последний EditText, приложение вылетает. Как мне остановить его сбой.

Мой XML макет:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<EditText
    android:id="@+id/sub"
    android:layout_width="140dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="20dp"
    android:layout_marginLeft="20dp"
    android:layout_marginTop="10dp"
    android:importantForAutofill="no"
    app:fontFamily="sans-serif-black"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/sub1"
    tools:ignore="LabelFor"
    android:inputType="text" />

<EditText
    android:id="@+id/sub1"
    android:layout_width="140dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="20dp"
    android:layout_marginLeft="20dp"
    android:layout_marginTop="20dp"
    android:importantForAutofill="no"
    app:fontFamily="sans-serif-black"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    tools:ignore="LabelFor"
    android:inputType="text" />

<EditText
    android:id="@+id/sub2"
    android:layout_width="140dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="20dp"
    android:layout_marginLeft="20dp"
    android:layout_marginTop="10dp"
    android:importantForAutofill="no"
    app:fontFamily="sans-serif-black"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/sub"
    tools:ignore="LabelFor"
    android:inputType="text" />

<EditText
    android:id="@+id/sub4"
    android:layout_width="140dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="20dp"
    android:layout_marginLeft="20dp"
    android:layout_marginTop="10dp"
    android:importantForAutofill="no"
    app:fontFamily="sans-serif-black"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/sub2"
    tools:ignore="LabelFor"
    android:inputType="text" />

<EditText
    android:id="@+id/sub5"
    android:layout_width="140dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="20dp"
    android:layout_marginLeft="20dp"
    android:layout_marginTop="10dp"
    android:importantForAutofill="no"
    app:fontFamily="sans-serif-black"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/sub4"
    tools:ignore="LabelFor"
    android:inputType="text" />

<EditText
    android:id="@+id/sub6"
    android:layout_width="140dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="20dp"
    android:layout_marginLeft="20dp"
    android:layout_marginTop="10dp"
    android:importantForAutofill="no"
    app:fontFamily="sans-serif-black"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/sub5"
    tools:ignore="LabelFor"
    android:inputType="text" />

<EditText
    android:id="@+id/sub7"
    android:layout_width="140dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="20dp"
    android:layout_marginLeft="20dp"
    android:layout_marginTop="10dp"
    android:importantForAutofill="no"
    app:fontFamily="sans-serif-black"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/sub6"
    tools:ignore="LabelFor"
    android:inputType="text" />

<EditText
    android:id="@+id/sub8"
    android:layout_width="140dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="20dp"
    android:layout_marginLeft="20dp"
    android:layout_marginTop="10dp"
    android:importantForAutofill="no"
    app:fontFamily="sans-serif-black"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/sub7"
    tools:ignore="LabelFor"
    android:inputType="text" />

<EditText
    android:id="@+id/num"
    android:layout_width="60dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="30dp"
    android:layout_marginLeft="30dp"
    android:layout_marginTop="20dp"
    android:importantForAutofill="no"
    android:ems="10"
    android:inputType="numberDecimal"
    android:textColor="#000000"
    app:layout_constraintStart_toEndOf="@+id/sub1"
    app:layout_constraintTop_toTopOf="parent"
    tools:ignore="LabelFor"/>

<EditText
    android:id="@+id/num1"
    android:layout_width="60dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="30dp"
    android:layout_marginLeft="30dp"
    android:layout_marginTop="10dp"
    android:importantForAutofill="no"
    android:ems="10"
    android:inputType="numberDecimal"
    android:textColor="#000000"
    app:layout_constraintStart_toEndOf="@+id/sub"
    app:layout_constraintTop_toBottomOf="@+id/num"
    tools:ignore="LabelFor"/>

<EditText
    android:id="@+id/num2"
    android:layout_width="60dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="30dp"
    android:layout_marginLeft="30dp"
    android:layout_marginTop="10dp"
    android:importantForAutofill="no"
    android:ems="10"
    android:inputType="numberDecimal"
    android:textColor="#000000"
    app:layout_constraintStart_toEndOf="@+id/sub2"
    app:layout_constraintTop_toBottomOf="@+id/num1"
    tools:ignore="LabelFor"/>

<EditText
    android:id="@+id/num3"
    android:layout_width="60dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="30dp"
    android:layout_marginLeft="30dp"
    android:layout_marginTop="10dp"
    android:importantForAutofill="no"
    android:ems="10"
    android:inputType="numberDecimal"
    android:textColor="#000000"
    app:layout_constraintStart_toEndOf="@+id/sub4"
    app:layout_constraintTop_toBottomOf="@+id/num2"
    tools:ignore="LabelFor"/>

<EditText
    android:id="@+id/num4"
    android:layout_width="60dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="30dp"
    android:layout_marginLeft="30dp"
    android:layout_marginTop="10dp"
    android:importantForAutofill="no"
    android:ems="10"
    android:inputType="numberDecimal"
    android:textColor="#000000"
    app:layout_constraintStart_toEndOf="@+id/sub5"
    app:layout_constraintTop_toBottomOf="@+id/num3"
    tools:ignore="LabelFor"/>

<EditText
    android:id="@+id/num5"
    android:layout_width="60dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="30dp"
    android:layout_marginLeft="30dp"
    android:layout_marginTop="10dp"
    android:importantForAutofill="no"
    android:ems="10"
    android:inputType="numberDecimal"
    android:textColor="#000000"
    app:layout_constraintStart_toEndOf="@+id/sub6"
    app:layout_constraintTop_toBottomOf="@+id/num4"
    tools:ignore="LabelFor"/>

<EditText
    android:id="@+id/num6"
    android:layout_width="60dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="30dp"
    android:layout_marginLeft="30dp"
    android:layout_marginTop="10dp"
    android:importantForAutofill="no"
    android:ems="10"
    android:inputType="numberDecimal"
    android:textColor="#000000"
    app:layout_constraintStart_toEndOf="@+id/sub7"
    app:layout_constraintTop_toBottomOf="@+id/num5"
    tools:ignore="LabelFor" />

<EditText
    android:id="@+id/num7"
    android:layout_width="60dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="30dp"
    android:layout_marginLeft="30dp"
    android:layout_marginTop="10dp"
    android:importantForAutofill="no"
    android:ems="10"
    android:inputType="numberDecimal"
    android:textColor="#000000"
    app:layout_constraintStart_toEndOf="@+id/sub8"
    app:layout_constraintTop_toBottomOf="@+id/num6"
    tools:ignore="LabelFor"/>

<Button
    android:id="@+id/btnAvr"
    android:layout_width="80dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="180dp"
    android:layout_marginLeft="180dp"
    android:layout_marginTop="12dp"
    android:text="@string/get_average"
    android:textSize="12sp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/tvAnswer" />

<TextView
    android:id="@+id/tvAnswer"
    android:layout_width="90dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="168dp"
    android:layout_marginLeft="170dp"
    android:layout_marginTop="40dp"
    android:text="@string/average"
    android:textColor="#000000"
    android:textSize="14sp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/num7" />

</androidx.constraintlayout.widget.ConstraintLayout>

Мой Java Код:

package com.example.cardmkii;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

private EditText sub;
private EditText sub1;
private EditText sub2;
private EditText sub4;
private EditText sub5;
private EditText sub6;
private EditText sub7;
private EditText sub8;
private EditText numb;
private EditText numb1;
private EditText numb2;
private EditText numb3;
private EditText numb4;
private EditText numb5;
private EditText numb6;
private EditText numb7;
private Button average;
private TextView result;

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

    sub = (EditText) findViewById(R.id.sub);
    sub1 = (EditText) findViewById(R.id.sub1);
    sub2 = (EditText) findViewById(R.id.sub2);
    sub4 = (EditText) findViewById(R.id.sub4);
    sub5 = (EditText) findViewById(R.id.sub5);
    sub6 = (EditText) findViewById(R.id.sub6);
    sub7 = (EditText) findViewById(R.id.sub7);
    sub8 = (EditText) findViewById(R.id.sub8);
    numb = (EditText) findViewById(R.id.num);
    numb1 = (EditText) findViewById(R.id.num1);
    numb2 = (EditText) findViewById(R.id.num2);
    numb3 = (EditText) findViewById(R.id.num3);
    numb4 = (EditText) findViewById(R.id.num4);
    numb5 = (EditText) findViewById(R.id.num5);
    numb6 = (EditText) findViewById(R.id.num6);
    numb7 = (EditText) findViewById(R.id.num7);
    average = (Button) findViewById(R.id.btnAvr);
    result = (TextView) findViewById(R.id.tvAnswer);

    average.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            double number = Double.parseDouble(numb.getText().toString());
            double number1 = Double.parseDouble(numb1.getText().toString());
            double number2 = Double.parseDouble(numb2.getText().toString());
            double number3 = Double.parseDouble(numb3.getText().toString());
            double number4 = Double.parseDouble(numb4.getText().toString());
            double number5 = Double.parseDouble(numb5.getText().toString());
            double number6 = Double.parseDouble(numb6.getText().toString());
            double number7 = Double.parseDouble(numb7.getText().toString());
            if (numb.length() > 0 && numb1.length() > 0 && numb2.length() > 0 && numb3.length() > 0 && numb4.length() > 0 && numb5.length() > 0 && numb6.length() > 0 && numb7.length() > 0){
                double average = (number + number1 + number2 + number3 + number4 + number5 + number6 + number7)/8;
                result.setText("Answer: " + String.valueOf(average));
            } else if (numb.length() > 0 && numb1.length() > 0 && numb2.length() > 0 && numb3.length() > 0 && numb4.length() > 0 && numb5.length() > 0 && numb6.length() > 0 && numb7.length() == 0){
                double average = (number + number1 + number2 + number3 + number4 + number5 + number6 + number7)/7;
                result.setText("Answer: " + String.valueOf(average));
            }
        }
    });
}
}

Ответы [ 3 ]

0 голосов
/ 06 марта 2020

Во-первых, давайте избавимся от одного источника cra sh, который вызван попыткой разобрать пустую строку. Для каждого местоположения, где вы читаете число, замените

double number = Double.parseDouble(numb.getText().toString());

на

try {
    double number = numb.getText().toString().isEmpty() ? 0 : Double.parseDouble(numb.getText().toString()) ;
} catch ( NumberFormatException e ) {
    // text not a number
}

Далее вы захотите отследить, сколько EditTexts фактически проанализировало значения в них. чтобы не искажать свое среднее значение, что тривиально.

0 голосов
/ 06 марта 2020

ваше приложение падает, потому что вы вызываете double number7 = Double.parseDouble(numb7.getText().toString());

, поэтому numb7.getText().toString()) эта вещь является аргументом parseDouble и должна

определенно разрешиться в double во время выполнения, но когда Вы оставляете любой текст редактирования пустым, в результате получается пустая строка или ноль, который явно не является двойным, поэтому ваше приложение вылетает с

NumberFormatException или IllegalArgumentException я не помню этого, вам нужно проверить все ли тексты редактирования имеют двойное значение, если их перед выполнением любого синтаксического анализа

что-то вроде if(num*.getText().toString().trim() != null & !num*.getText().toString.trim().equals("") )

number7 = Double.parseDouble(numb7.getText().toString());

0 голосов
/ 06 марта 2020

Ваша ошибка в этой части:

if (numb.length() > 0 && numb1.length() > 0 && numb2.length() > 0 && numb3.length() > 0 && numb4.length() > 0 && numb5.length() > 0 && numb6.length() > 0 && numb7.length() > 0){
    double average = (number + number1 + number2 + number3 + number4 + number5 + number6 + number7)/8;
    result.setText("Answer: " + String.valueOf(average));
} else if (numb.length() > 0 && numb1.length() > 0 && numb2.length() > 0 && numb3.length() > 0 && numb4.length() > 0 && numb5.length() > 0 && numb6.length() > 0 && numb7.length() == 0){
    double average = (number + number1 + number2 + number3 + number4 + number5 + number6 + number7)/7;
    result.setText("Answer: " + String.valueOf(average));
}

Вы используете numb , numb1 , et c .. переменные для проверки длины. Это объект EditText , поэтому он не даст вам длину введенного вами значения.

Вы можете проверить, что значения всех число, число 1, число 2 и т. Д. c .. больше нуля или нет.

Бонус: Если вам нужны двойные значения из каждого EditText, то сначала вы должны проверить, что значения не пусты. Если значения EditText пустые и вы проанализируете Double, это приведет к сбою вашего приложения.

Надеюсь, вы поняли мою точку зрения.

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