При нажатии кнопки приложение выходит из строя
привет
мое приложение обналичивает деньги, когда я нажимаю кнопку Отправить, но не проверяет поля должным образом.
он работает так, как я хочу, но если я нажму на кнопку Отправить, ничего не вводя, он вылетит.я новичок в этом своем первом приложении
Что я уже пробовал:
@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
блоки для обработки выбрасываемых исключений?