我正在尝试创建一个for
循环来为布局添加视图。 for
- 循环工作正常(我尝试使用初始化变量)但我需要从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" />
答案 0 :(得分:5)
您的EditText
最初的值为String
(即""
)。这显然不是一个数字,因此当您尝试拨打int i = 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{}
代码没有出错,则只会将其更改为其他值。
答案 1 :(得分:1)
如果你试图解析空字符串,它将始终抛出NumberFormatException
。
将您的代码更改为以下内容。
int i;
String change = numSensors.getText().toString();
if(change.length>0)
{
i = Integer.parseInt(change);
}
else
{
i=0;
}
答案 2 :(得分:0)
我认为初始编辑文本将为空,因此“”(blank is not a valid input
)抛出错误,您应填写编辑文本中的数据,然后单击任何事件,您应该进行解析工作.... / p>
答案 3 :(得分:0)
编辑布局文件
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="number"
android:text="0"
android:id="@+id/num_sensors" />
答案 4 :(得分:0)
您收到此错误是因为编辑文本中最初没有任何内容或""
/空字符串。编辑文本仍在显示时获取文本是没有意义的。您可能希望有一个按钮或其他事件,表示用户已完成输入编辑文本中的值,然后您可以继续获取编辑文本的值。但总是要检查空字符串
答案 5 :(得分:0)
bez你在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....
}
答案 6 :(得分:0)
为了防止int获得&#34;&#34; value,这是在空的EditText字段中第二次单击时发生的情况,您可以在java代码中抛出此行:
int i;
String change = numSensors.getText().toString();
if(!(change.equals("")))
{
i = Integer.parseInt(change);
}