Я пытаюсь создать for
-loop, чтобы добавить представления к макету. for
-loop работают нормально (я пробовал с инициализированными переменными), но мне нужно, чтобы получить целое число от EditText
. Я использовал try-catch
и LogCat сообщает мне следующее...
java.lang.NumberFormatException: invalid int "".
Веб-сайт developers.android.com говорит, что это от неправильного преобразования строки в целое число, но я не понимаю, как я мог неправильно получать данные из EditText
.
Это мой код...
public class UserPref2Activity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
try
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
EditText numSensors = (EditText) findViewById(R.id.num_sensors);
String change = numSensors.getText().toString();
int i = Integer.parseInt(change);
int j; //iterates through the for loop
ScrollView sv = new ScrollView(this);
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
sv.addView(ll);
for(j=1;j<i;j++)
{
EditText name = new EditText(this);
name.setText("Name:");
EditText type = new EditText(this);
type.setText("Type:");
EditText bits = new EditText(this);
bits.setText("Bits:");
ll.addView(name);
ll.addView(type);
ll.addView(bits);
}
this.setContentView(sv);
}
catch (Exception e)
{
//sends actual error message to the log
Log.e("ERROR", "ERROR IN CODE:" + e.toString());
//prints out location of error
e.printStackTrace();
}
}
}
И это мой XML файл...
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:id="@+id/userLayout" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Enter number of sensors:" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="number"
android:id="@+id/num_sensors" />
Первоначально у вашего EditText
есть пустая String
для ее значения (т.е. ""
). Это, очевидно, не число, поэтому, когда вы пытаетесь вызвать int я = Integer.parseInt(change);
это дает вам сообщение об ошибке как таковое.
Есть несколько способов исправить это, но в основном это сводится к тому, чтобы предотвратить ошибку, установив начальное значение или обнаружив пустую строку и правильно ее обработать.
Чтобы предотвратить возникновение ошибки...
EditText numSensors = (EditText) findViewById(R.id.num_sensors);
String change = numSensors.getText().toString();
if (change.equals("")){ // detect an empty string and set it to "0" instead
change = "0";
}
int i = Integer.parseInt(change);
Или установите начальное значение как "0"
для EditText
, однако это также отображает значение 0
в EditText
на вашем интерфейсе, а не пустое, поэтому оно может не подходить для всех целей...
<EditText android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="number"
android:text="0"
android:id="@+id/num_sensors" />
Если вы хотите обнаружить ошибку и обработать ее правильно, вы сделаете это...
EditText numSensors = (EditText) findViewById(R.id.num_sensors);
String change = numSensors.getText().toString();
int i = 0; // set it to 0 as the default
try {
i = Integer.parseInt(change);
}
catch (NumberFormatException e){}
Это в основном устанавливает значение i = 0
и будет изменять его только на другое значение, если код try{}
не даст ошибку.
Если вы попытаетесь разобрать пустую строку, она всегда будет NumberFormatException
.
Измените свой код следующим образом.
int i;
String change = numSensors.getText().toString();
if(change.length>0)
{
i = Integer.parseInt(change);
}
else
{
i=0;
}
Чтобы не допустить, чтобы int получал значение "", что происходит, когда второй щелчок в пустом поле EditText, вы можете выбросить эту строку в свой Java-код:
int i;
String change = numSensors.getText().toString();
if(!(change.equals("")))
{
i = Integer.parseInt(change);
}
bez вы передаете пустую строку String в parseInt(), поэтому проверьте перед синтаксической обработкой строки на int как:
EditText numSensors = (EditText) findViewById(R.id.num_sensors);
String change = numSensors.getText().toString();
if (change.trim().equals("")) {
//DO SOMETHING HERE
}
else
{
int i = Integer.parseInt(change);
YOUR CODE HERE....
}
Я думаю, что исходный текст редактирования будет пустым, поэтому "" (blank is not a valid input
), это ошибка, которую вы должны заполнить данными в "Редактирование текста", а затем щелкнуть по любому событию, которое вы должны выполнить синтаксический анализ....
Вы получаете эту ошибку, потому что в тексте редактирования ничего нет или ""
/Empty String. Не имеет смысла получать текст текста редактирования, когда он все еще отображается. Возможно, вы захотите иметь кнопку или другое событие, которое будет означать, что пользователь выполнил ввод значения в тексте редактирования, а затем вы можете продолжить и получить значение текста редактирования. Но всегда проверяйте пустую строку
Редактируйте файл макета
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="number"
android:text="0"
android:id="@+id/num_sensors" />