Android 中双精度数组的 TextView:IllegalStateException、InvocationTargetException 和 NumberFormatException

TextViews to Array of Doubles in Android: IllegalStateException, InvocationTargetException and NumberFormatException

我正在构建一个简单的应用程序来计算费用和生活成本并提供智能生活建议。

该应用程序将每笔费用请求为文本视图,然后当单击按钮时,它会遍历文本视图,将它们解析为双精度值并将它们分配给 public 值。

这是我的代码:

package ericleeconklin.costoflivingcalculator;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import android.content.Context;


public class EnterExpenses extends ActionBarActivity {

    public Double rentMortgage;
    public Double utilities;
    public Double insurance;
    public Double phoneInternet;
    public Double food;
    public Double carPayment;
    public Double miscellaneous;



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


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_enter_expenses, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

public void enterExpenses(View view) {
    try {
        TextView rentView = (TextView) findViewById(R.id.enterRent);
        TextView utilitiesView = (TextView) findViewById(R.id.enterUtilities);
        TextView insuranceView = (TextView) findViewById(R.id.enterInsurance);
        TextView phoneView = (TextView) findViewById(R.id.enterTV);
        TextView foodView = (TextView) findViewById(R.id.enterFood);
        TextView carView = (TextView) findViewById(R.id.enterCarPayment);
        TextView miscView = (TextView) findViewById(R.id.enterMisc);

        Double[] doubleExpensesArray = new Double[]{Double.parseDouble(rentView.toString()),
                Double.parseDouble(utilitiesView.toString()),
                Double.parseDouble(insuranceView.toString()),
                Double.parseDouble(phoneView.toString()),
                Double.parseDouble(foodView.toString()),
                Double.parseDouble(carView.toString()),
                Double.parseDouble(miscView.toString())};

            rentMortgage = doubleExpensesArray[0];
            utilities = doubleExpensesArray[1];
            insurance = doubleExpensesArray[2];
            phoneInternet = doubleExpensesArray[3];
            food = doubleExpensesArray[4];
            carPayment = doubleExpensesArray[5];
            miscellaneous = doubleExpensesArray[6];
            Intent myIntent = new Intent(this, FinalGrade.class);
            startActivity(myIntent);

    } catch(NullPointerException nullPointer) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setMessage("Please enter valid amounts!")
                .setCancelable(false)
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        //do things
                    }
                });
        AlertDialog alert = builder.create();
        alert.show();
    }
}
}

还有我的XML:

<ScrollView
android:layout_width="fill_parent"
android:id="@+id/scrollView"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">

<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Enter Your Monthly Expenses (USD)"
        android:id="@+id/textView"
        android:layout_marginTop="20dp"
        android:layout_centerHorizontal="true"
        android:textAlignment="center"/>

    <EditText android:id="@+id/enterRent"
              android:layout_width="210dp"
              android:layout_height="wrap_content"
              android:padding="3dip"
              android:layout_marginTop="100dp"
              android:layout_centerHorizontal="true"
              android:ellipsize="end"
              android:singleLine="true"
              android:textColorHint="#888888"
              android:hint="Enter Rent/Mortgage">
    </EditText>

    <EditText android:id="@+id/enterUtilities"
              android:layout_width="210dp"
              android:layout_height="wrap_content"
              android:padding="3dip"
              android:layout_marginTop="160dp"
              android:layout_centerHorizontal="true"
              android:inputType="number"
              android:textColorHint="#888888"
              android:hint="Enter Utilities">
    </EditText>

    <EditText android:id="@+id/enterInsurance"
              android:layout_width="210dp"
              android:layout_height="wrap_content"
              android:padding="3dip"
              android:layout_marginTop="220dp"
              android:layout_centerHorizontal="true"
              android:inputType="number"
              android:textColorHint="#888888"
              android:hint="Enter Insurance">
    </EditText>

    <EditText android:id="@+id/enterTV"
              android:layout_width="210dp"
              android:layout_height="wrap_content"
              android:padding="3dip"
              android:layout_marginTop="280dp"
              android:layout_centerHorizontal="true"
              android:inputType="number"
              android:textColorHint="#888888"
              android:hint="Enter TV/Phone/Internet">
    </EditText>

    <EditText android:id="@+id/enterFood"
              android:layout_width="210dp"
              android:layout_height="wrap_content"
              android:padding="3dip"
              android:layout_marginTop="340dp"
              android:layout_centerHorizontal="true"
              android:inputType="number"
              android:textColorHint="#888888"
              android:hint="Enter Food">
    </EditText>

    <EditText android:id="@+id/enterCarPayment"
              android:layout_width="210dp"
              android:layout_height="wrap_content"
              android:padding="3dip"
              android:layout_marginTop="400dp"
              android:layout_centerHorizontal="true"
              android:inputType="number"
              android:textColorHint="#888888"
              android:hint="Enter Car Payment">
    </EditText>

    <EditText android:id="@+id/enterMisc"
              android:layout_width="210dp"
              android:layout_height="wrap_content"
              android:padding="3dip"
              android:layout_marginTop="460dp"
              android:layout_centerHorizontal="true"
              android:inputType="number"
              android:textColorHint="#888888"
              android:hint="Enter Miscellaneous">
    </EditText>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Grade My Cost of Living"
        android:id="@+id/enterExpenses"
        android:layout_marginTop="520dp"
        android:layout_centerHorizontal="true"
        android:onClick="enterExpenses"/>




</RelativeLayout>
</ScrollView>

在解析所有双打之前,您应该首先获取 TextView 的文本

Double.parseDouble(utilitiesView.toString()), // that's wrong
Double.parseDouble(utilitiesView.getText().toString()), // that's right

依此类推所有 TextView。

这几行你错了

double[] doubleExpensesArray = new double[]{Double.parseDouble(rentView**.getText().**toString()),
            Double.parseDouble(utilitiesView.**.getText().**toString()),
            Double.parseDouble(insuranceView.**.getText().**toString()),
            Double.parseDouble(phoneView.**.getText().**toString()),
            Double.parseDouble(foodView.**.getText().**toString()),
            Double.parseDouble(carView.**.getText().**toString()),
            Double.parseDouble(miscView.**.getText().**toString())};

首先,您的 XML 仅显示 1 个 TextView,其余为 EditText,因此在您的 activity 代码中,需要为您在视图中找到的 ID 反映正确的对象类型。

EditText rentView = (EditText) findViewById(R.id.enterRent);
EditText utilitiesView = (EditText) findViewById(R.id.enterUtilities);
EditText insuranceView = (EditText) findViewById(R.id.enterInsurance);
EditText phoneView = (EditText) findViewById(R.id.enterTV);
EditText foodView = (EditText) findViewById(R.id.enterFood);
EditText carView = (EditText) findViewById(R.id.enterCarPayment);
EditText miscView = (EditText) findViewById(R.id.enterMisc);

其次,您必须在 EditText 上使用 getText().toString() 才能从中获取文本值。请参阅 EditText.

上的文档
Double value = Double.parseDouble(carView.getText().toString());

然后如果你想通过 Intent 将你的 Double[] 发送到最终 activity,你可以这样做。

Intent intent = new Intent(EnterExpenses.this, FinalGrade.class);
Bundle bundle = new Bundle();
bundle.putDoubleArray("your_double_key", doubleExpensesArray);
intent.putExtras(bundle);
startActivity(intent);

并且会在 "FinalGrade.class" 中收到双倍的收入,如下所示:

Bundle bundle = this.getIntent().getExtras();
Double[] double = bundle.getDoubleArray("your_double_key");

* 你可以试试这个 *

我还亲自在我的 activity 代码中设置我的按钮点击侦听器,而不是在 XML android:onClick=""/> 中。这可能对您的问题有所帮助。

Button calculate = (Button) findViewById(R.id.button).
       calculate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick() {
            enterExpenses();
        }
    });