【问题标题】:Getting Int from EditText causes error?从 EditText 获取 Int 会导致错误?
【发布时间】:2014-05-04 06:17:43
【问题描述】:

首先很抱歉,如果之前已经有人问过并回答过这个问题,我找不到与我的问题相关的任何内容。

所以我正在为大学做一个项目,我需要从 EditText 小部件中获取 int 值。我被告知要使用 parseInt 来执行此操作,但是在运行我的程序时,该行代码会导致应用程序崩溃。我不知道我做错了什么,我对android开发还是很陌生,谢谢你的帮助:)

public void Calculate (View view)
{
    int MilesTravelled;
    int FuelUsed;
    int MPG;

    /* the two lines below are what cause the application to crash */

    MilesTravelled = Integer.parseInt(txtMilesTravelled.getText().toString());
    FuelUsed = Integer.parseInt(txtFuelUsed.getText().toString());

    FuelUsed = (int) (FuelUsed / 4.55);
    MPG = MilesTravelled / FuelUsed; 
    lblMPG.setText(FuelUsed); 
}

【问题讨论】:

  • 你能写出logcat的输出吗?
  • 我不能,我无法在虚拟开发者中运行应用程序,并且 eclipse 没有检测到我的平板电脑,所以我必须将 apk 复制到我的设备并像这样运行
  • 不能创建模拟器?
  • 不,不知道为什么,但模拟器无法在我的笔记本电脑上运行。不过我会再试一次。 (它加载使屏幕保持黑色)
  • 错误可能在这一行:lblMPG.setText(FuelUsed);写了一个答案,看看是否有效。

标签: android android-edittext int


【解决方案1】:

你在 onCreate() 函数中有这个吗?

 EditText txtMilesTravelled = (EditText) findViewById(R.id.YourEditText);

但我认为你混合了Integerint。它们不一样:

See this link!

【讨论】:

  • 啊,在此处设置文本之前,您应该将 int 设置为字符串:lblMPG.setText(FuelUsed.toString());
【解决方案2】:

首先,不要将变量或方法名称的首字母大写。遵循 Java 编码约定,仅对类执行此操作。

可能导致您的应用崩溃的原因是您试图将标签的文本设置为整数。 TextView 的setText 方法需要接收一个字符串。

所以改变:

lblMPG.setText(FuelUsed);

到:

lblMPG.setText(String.valueOf(FuelUsed)); 

否则可能是它试图将非数字字符串解析为整数。 例如,如果 EditText 为空,则会导致您的应用程序崩溃。为了防止这种情况,试试这个:

int MilesTravelled = 0, FuelUsed = 0;
try {

    MilesTravelled = Integer.parseInt(txtMilesTravelled.getText().toString());
    FuelUsed = Integer.parseInt(txtFuelUsed.getText().toString());

} catch (NumberFormatException nfe) {

    Toast.makeText(getApplicationContext(), "Error NFE!", 0).show();
    nfe.printStackTrace();
}

这样,它会捕获一个 NumberFormatException 错误(将字符串解析为不能表示为整数的整数,例如“hello”)。如果它捕获到错误,它会为发生错误而祝酒,并且您的整数变量将保持为 0。


或者您可以使用以下正则表达式测试字符串是否仅包含数字:

int MilesTravelled = 0, FuelUsed = 0;

if (txtMilesTravelled.getText().toString().matches("[0-9]+")) {
    MilesTravelled = Integer.parseInt(txtMilesTravelled.getText().toString());
} else {
    // contains characters that are not digits
}
if (txtFuelUsed.getText().toString().matches("[0-9]+")) {
    FuelUsed = Integer.parseInt(txtFuelUsed.getText().toString());
} else {
    // contains characters that are not digits
}

如果这不是问题,请确保正确定义变量。

txtMilesTravelledtxtFuelUsed 应该是EditText

EditText txtMilesTravelled = (EditText)findViewById(R.id.txtMilesTravelled);
EditText txtFuelUsed = (EditText)findViewById(R.id.txtFuelUsed);

并确保您的 R.id.editText 确实存在于您的布局中,并且 ID 是正确的。


最后一件事,在计算 MPG 之前确保 FuelUsed 不为 0,因为这样你就除以 0:

int MPG = 0;

if (FuelUsed != 0) {
    MPG = MilesTravelled / FuelUsed; 
}

【讨论】:

    【解决方案3】:

    我假设您在EditTexts 中输入完美整数。在使用parseInt 之前使用trim 函数txtMilesTravelled.getText().toString().trim() 可能是个好主意。

    但是,我认为主要问题在这里:lblMPG.setText(FuelUsed); FuelUsed 是一个整数值,当您将整数传递给setText() 时,它会查找具有该整数值的字符串资源。所以你应该将一个字符串传递给setText() 方法。

    使用:lblMPG.setText(Integer.toString(FuelUsed));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      • 1970-01-01
      • 2022-11-15
      • 2017-08-10
      相关资源
      最近更新 更多