Member 10471797 Ответов: 1

При нажатии кнопки приложение выходит из строя


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

Что я уже пробовал:

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



    Button addBtn = (Button) findViewById(R.id.addBtn);
    addBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            EditText amoutGiven = (EditText) findViewById(R.id.amountG);
            EditText manyPeople = (EditText) findViewById(R.id.mPeople);
            EditText moenyGiven = (EditText) findViewById(R.id.moneyG);
            TextView changeTxt  = (TextView) findViewById(R.id.changeTxt);
            TextView nxtBtn     = (TextView) findViewById(R.id.nxtBtn);
            TextView tryBtn     = (TextView) findViewById(R.id.tryBtn);
            android.view.inputmethod.InputMethodManager imm = (android.view.inputmethod.InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);

            if (amoutGiven.getText().length()==0){
                amoutGiven.setError("This field is required");
            }

            if (manyPeople.getText().length()==0){
                manyPeople.setError("This field is required");
            }

            if (moenyGiven.getText().length()==0){
                moenyGiven.setError("This field is required");
            }


            int num1 = Integer.parseInt(amoutGiven.getText().toString());
            int num2 = Integer.parseInt(manyPeople.getText().toString());
            int num3 = Integer.parseInt(moenyGiven.getText().toString());
            int total = num1 * num2;
            int change = num3 - total;


            changeTxt.setVisibility((changeTxt.getVisibility() == View.VISIBLE)
                    ? View.INVISIBLE : View.VISIBLE);


            if (change < 0 ){
                changeTxt.setText("Your numbers dont add up");
                tryBtn.setVisibility((tryBtn.getVisibility() == View.VISIBLE)
                        ? View.INVISIBLE : View.VISIBLE);
                tryBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        startActivity(new Intent(MainActivity.this, MainActivity.class));

                    }
                });

            }else {

                changeTxt.setText( "Give Back Change oF: R" + change +"" );
                nxtBtn.setVisibility((nxtBtn.getVisibility() == View.VISIBLE)
                        ? View.INVISIBLE : View.VISIBLE);
                nxtBtn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        startActivity(new Intent(MainActivity.this, MainActivity.class));

                    }
                });




            }



        }
    });



}

Richard MacCutchan

            TextView nxtBtn     = (TextView) findViewById(R.id.nxtBtn);            TextView tryBtn     = (TextView) findViewById(R.id.tryBtn);

Вы уверены, что это должны быть текстовые представления, а не кнопки?

Member 10471797

да должна быть кнопка, которую я изменил, но все равно вылетает, когда я нажимаю submit без каких-либо входов в текстовое поле.findViewById() не являются нулевыми

Richard MacCutchan

Какая кнопка выполняет отправку и где она падает?

Member 10471797

addBtn - это submit..crashes, так как в нем закрывается приложение при щелчке без значений в полях

Richard MacCutchan

            if (amoutGiven.getText().length()==0){
                amoutGiven.setError("This field is required");
            }

// ...
            int num1 = Integer.parseInt(amoutGiven.getText().toString());

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

Jochen Arndt

Я бы ожидал, что nxtBtn и tryBtn будут иметь тип Button, а не тип TextView.

Проверьте также, не являются ли все представления, возвращаемые функцией findViewById (), нулевыми.

Member 10471797

если я срежу код сверху:

@Ручная коррекция
protected void onCreate(Bundle savedInstanceState) {
супер.метод onCreate(savedInstanceState);
setContentView(R. layout.activity_main);



Кнопка addBtn = (кнопка) findViewById(R. id.addBtn);
addBtn.setOnClickListener(новый вид.OnClickListener() {
@Ручная коррекция
общественного недействительными onclick(посмотреть V) {
AmoutGiven полей EditText = (полей EditText) findViewById, чтобы найти(ИД Р..amountG);
Многие полей EditText = (полей EditText) findViewById, чтобы найти(ИД Р..mPeople);
MoenyGiven полей EditText = (полей EditText) findViewById, чтобы найти(ИД Р..moneyG);
Виджет TextView changeTxt = (виджет TextView) findViewById, чтобы найти(ИД Р..changeTxt);
Виджет TextView nxtBtn = (виджет TextView) findViewById, чтобы найти(ИД Р..nxtBtn);
Виджет TextView tryBtn = (виджет TextView) findViewById, чтобы найти(ИД Р..tryBtn);
андроид.смотреть.метода ввода.InputMethodManager IMM " и " = ("андроид".смотреть.метода ввода.InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);

if (amoutGiven.getText().length()==0){
amoutGiven.setError("это поле обязательно для заполнения");
}

if (manyPeople.getText().length()==0){
manyPeople.setError("это поле обязательно");
}

if (moenyGiven.getText().length()==0){
moenyGiven.setError("это поле обязательно для заполнения");
}

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

инт поля num1 = целое число.parseInt(amoutGiven.то gettext().метод toString());
инт пит2 = целое число.parseInt(множества людей.то gettext().метод toString());
инт клавиша num3 = целое число.parseInt(moenyGiven.то gettext().метод toString());
int total = num1 * num2;
int change = num3 - всего;

Jochen Arndt

Как уже отметил Ричард:
Вы вызываете parseInt() , даже если знаете, что входные данные пусты.

parseInt() выдаст исключение, если входное значение не является допустимым числом, включающим пустые строки. Поэтому вызывайте parseInt() только тогда, когда вы знаете, что входные данные не пусты и являются допустимым числом.

Обратите также внимание, что исключение не является крахом. Это завершение программы из-за проблемы с указанием того, что произошло. При сбое вы не получите никакого уведомления или только общее сообщение от операционной системы, в то время как сообщения execption поступают из приложения.

Наконец, нет необходимости перепечатывать код в качестве комментария. Это уже входит в часть вашего вопроса и гораздо лучше читается там.

David Crow

Почему у тебя их нет try/catch блоки для обработки выбрасываемых исключений?

1 Ответов

Рейтинг:
1

Member 13788700

вы не используете никаких условий проверки здесь братан , при нажатии на кнопку отправить , первое , что вы должны хотеть сделать в этом событии onClickbtn , вы должны проверить, если какой-либо из полей пуст, если он пуст, вы должны дать тост еще сделать то, что вы хотите (то есть ваш необходимый код должен быть в другом состоянии), это может решить вашу проблему