Android:根据列表视图中点击的项目计算价格。应用程序在总活动 Logcat 中崩溃:无效浮点数:“”

Posted

技术标签:

【中文标题】Android:根据列表视图中点击的项目计算价格。应用程序在总活动 Logcat 中崩溃:无效浮点数:“”【英文标题】:Android: Calculate price from clicked items in listview. App crashes in total activity Logcat:Invalid float: "" 【发布时间】:2018-07-30 15:22:38 【问题描述】:

我是这方面的菜鸟,所以请多多包涵。我有一个带有价格的食物和饮料的列表视图,然后是一个继续按钮,它将显示订单摘要和其他活动中的总金额。单击某些项目然后单击继续按钮后,应用程序崩溃“不幸的是,应用程序名称已停止。”但是当我单击继续按钮而不单击任何项​​目时,它会显示订单摘要的布局。因此,错误发生在数据传递中。在 logcat 中,我首先注意到 Invalid float: "" 我不知道如何解决这个问题。 我使用 SQLite 作为项目数据库


这是似乎出现错误的订单摘要和总金额的活动代码。

package edu.sti.snapchit;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.util.StringTokenizer;
import java.lang.String;


public class TotalsActivity extends AppCompatActivity

MyApp mApp;
EditText et_summary;
TextView tv_total;
Button btn_code;

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.totals);
    btn_code = (Button) findViewById(R.id.btn_code);
    mApp=((MyApp)getApplicationContext());
    et_summary = (EditText) findViewById(R.id.et_summary);
    tv_total = (TextView) findViewById(R.id.tv_total);
    et_summary.setText(mApp.getGlobalVarValue());
    String str = mApp.getGlobalVarValue();
    StringTokenizer st = new StringTokenizer(str,"php");
    String test="";
    float total=0;
    int count =0;

    while(st.hasMoreElements())
    
        test = st.nextElement().toString().substring(0,1);
        if(count>0)
            total += Float.parseFloat(test);
        count++;
    

    tv_total.setText("Total:" + total+"");
    mApp.setGlobalClear();
    btn_code.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 

            Intent intent = new Intent(TotalsActivity.this, GeneratorActivity.class);
            startActivity(intent);
        
    );




public boolean isFloat(String input)


    try
    
        Float.parseFloat(input);
        return true;
    
    catch(Exception e)
    
        return false;
    




总 XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:orientation="vertical"
android:weightSum="1"
android:background="@android:color/holo_orange_light">

<TextView
    android:layout_
    android:layout_
    android:text="            Order Summary            "
    android:textSize="30dp"
    android:id="@+id/textV"
    android:layout_gravity="center_horizontal"
    android:layout_weight="0.07"
    android:background="@android:color/holo_blue_dark"
    android:textColor="@android:color/background_light"
    android:textStyle="bold"/>

<LinearLayout
    android:layout_
    android:layout_
    android:orientation="vertical"
    android:background="@android:color/background_light"
    android:layout_marginTop="6dp">



    <EditText
        android:id="@+id/et_summary"
        android:layout_
        android:layout_
        android:layout_gravity="center_horizontal"
        android:layout_weight="0.55"
        android:inputType="text"
        android:textSize="24dp"
        android:hint="Summary"/>

    <TextView
        android:layout_
        android:layout_
        android:text="Total  : "
        android:textSize="30dp"
        android:layout_weight="0.07"
        android:id="@+id/tv_total"/>



</LinearLayout>
<Button
    android:id="@+id/btn_code"
    android:layout_
    android:layout_
    android:layout_gravity="bottom"
    android:background="@drawable/buttonborder"
    android:clickable="true"
    android:text="Proceed to Qr Code Generator"
    android:textColor="@android:color/background_light"
    android:textStyle="bold"/>
</LinearLayout>

包含列表视图的食物活动代码

package edu.sti.snapchit;

import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;

import java.util.HashMap;


public class NewFoodsActivity extends AppCompatActivity 

MyApp mApp;
private HashMap<String, Location> locations;
ListView listView1;
SQLiteDatabase db;



@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    db=openOrCreateDatabase("Foods_DB", Context.MODE_PRIVATE, null);
    setContentView(R.layout.new_foods);
    locations = loadLocationData();
    addListenerButton();
    initializeUI();

public void initializeUI()

    String[] foodies = getFoodNames();
    ArrayAdapter<String> adapter = new ArrayAdapter<String>
(this,android.R.layout.simple_list_item_1, foodies);
    listView1.setAdapter(adapter);

private String[] getFoodNames()

    String[] foodies = new String[locations.size()];
    foodies = locations.keySet().toArray(foodies);
    return foodies;

private void displaySelectedFoodInfo(String foodName)



public void showMessage(String title,String message)

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setCancelable(true);
    builder.setTitle(title);
    builder.setMessage(message);
    builder.show();

private HashMap<String, Location>loadLocationData()

    HashMap<String, Location>locations = new HashMap<String, Location>();
    Cursor c=db.rawQuery("SELECT * FROM table_foods order by food_id 
asc",null);
    StringBuffer buffer = new StringBuffer();
    while(c.moveToNext())
    
        locations.put("- "+c.getString(1).toString()+" [Php 
"+c.getString(2).toString()+"]", new Location(Integer.parseInt(c.getString(0)),c.getString(1).toString(),Double.parseDouble(c.getString(2))));

    
    return locations;

public void addListenerButton()

    final Context context = this;
    Button btnAdd = (Button)findViewById(R.id.btn_add);
    Button btnProceed = (Button)findViewById(R.id.btnProceed);
    Button btn_drinks = (Button)findViewById(R.id.btn_drinks);
    Button btn_foods = (Button)findViewById(R.id.btn_foods);
    listView1 = (ListView) findViewById(R.id.listView1);
    listView1.setOnItemClickListener(
            new AdapterView.OnItemClickListener() 
                @Override
                public void onItemClick(AdapterView<?> Arg0, View view, int 
position, long id) 
                    Object o = listView1.getItemAtPosition(position);
                    String pen = o.toString();

                    mApp=((MyApp)getApplicationContext());
                    mApp.setGlobalVarValue(pen);
                    Toast.makeText(getApplicationContext(), "Item Added" + 
""+ pen, Toast.LENGTH_LONG).show();


                
            
    );
    btnAdd.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            Intent intent = new Intent(context, NewAddFoods.class);

            startActivity(intent);
        
    );
    btnProceed.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            Intent intent = new Intent(context, TotalsActivity.class);

            startActivity(intent);
        
    );
    btn_foods.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            Intent intent = new Intent(context, NewFoodsActivity.class);

            startActivity(intent);
        
    );
    btn_drinks.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            Intent intent = new Intent(context, NewDrinksActivity.class);

            startActivity(intent);
        
    );
  


食品 XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:gravity="bottom|center_horizontal"
android:orientation="vertical"
android:background="@android:color/holo_orange_light">

<TextView
    android:layout_
    android:layout_
    android:text="Food Items"
    android:textAlignment="center"
    android:textSize="30sp"
    android:background="@android:color/holo_blue_dark"
    android:textColor="@android:color/background_light"
    android:textStyle="bold"/>
<LinearLayout
    android:layout_
    android:layout_
    android:orientation="horizontal"
    android:layout_marginTop="5dp">
    <Button
        android:id="@+id/btn_foods"
        android:layout_
        android:layout_
        android:text="Foods"
        android:background="@drawable/buttonborder"
        android:textColor="@android:color/background_light"
        android:textStyle="bold"/>

    <Button
        android:id="@+id/btn_drinks"
        android:layout_
        android:layout_
        android:text="Drinks"
        android:background="@drawable/buttonborder"
        android:textColor="@android:color/background_light"
        android:textStyle="bold"/>
</LinearLayout>

<ListView
    android:layout_
    android:layout_
    android:id="@+id/listView1"
    android:background="@android:color/background_light"
    android:layout_marginTop="5dp"
    android:layout_marginLeft="5dp"
    android:layout_marginRight="5dp"/>

<LinearLayout
    android:layout_
    android:layout_
    android:orientation="horizontal"
    android:layout_marginTop="5dp"
    >
<Button
    android:id="@+id/btn_add"
    android:layout_
    android:layout_
    android:layout_gravity="center_horizontal"
    android:layout_marginTop="10dp"
    android:text="Add Snacks"
    android:background="@drawable/buttonborder"
    android:textColor="@android:color/background_light"
    android:textStyle="bold"/>

<Button
    android:id="@+id/btnProceed"
    android:layout_
    android:layout_
    android:layout_gravity="center_horizontal"
    android:text="Proceed"
    android:background="@drawable/buttonborder"
    android:textColor="@android:color/background_light"
    android:textStyle="bold"/>

</LinearLayout>


我的应用程序

package edu.sti.snapchit;

import android.app.Application;

public class MyApp extends Application
private String mGlobalVarValue="";

public String getGlobalVarValue()
    return mGlobalVarValue;

public void setGlobalVarValue(String str)
    mGlobalVarValue += str+"\n";

public void setGlobalClear()
    mGlobalVarValue="";


位置

package edu.sti.snapchit;

public class Location 

private int id;
private String name;
private double price;


public Location(int id,String name, double price)
    this.id = id;
    this.name = name;
    this.price = price;

@Override
public String toString()
    return this.id + " " +this.name +" " +this.price;



这是 LOGCAT 中的红色文本

02-20 04:37:23.624 1447-1447/edu.sti.snapchit E/AndroidRuntime: 致命 例外:主要 java.lang.RuntimeException:无法启动活动 组件信息edu.sti.snapchit/edu.sti.snapchit.TotalsActivity: java.lang.NumberFormatException:无效的浮点数:“” 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 在 android.app.ActivityThread.access$600(ActivityThread.java:141) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:5103) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:525) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 在 dalvik.system.NativeStart.main(本机方法) 引起:java.lang.NumberFormatException:无效浮点数:“” 在 java.lang.StringToReal.invalidReal(StringToReal.java:63) 在 java.lang.StringToReal.parseFloat(StringToReal.java:289) 在 java.lang.Float.parseFloat(Float.java:300) 在 edu.sti.snapchit.TotalsActivity.onCreate(TotalsActivity.java:40) 在 android.app.Activity.performCreate(Activity.java:5133) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)

02-20 04:37:29.372 1494-1494/edu.sti.snapchit E/dalvikvm: 不能 查找类 'android.graphics.drawable.RippleDrawable',引用自 方法 android.support.v7.widget.AppCompatImageHelper.hasOverlappingRendering

02-20 04:37:30.592 1494-1494/edu.sti.snapchit E/OpenGLRenderer: 从 GradienCache 02-20 04:37:30.616 获取 MAX_TEXTURE_SIZE 1494-1494/edu.sti.snapchit E/OpenGLRenderer:获取 MAX_TEXTURE_SIZE 来自 Caches::initConstraints()

附言。是的,我在制作这个应用程序时确实遵循了 youtube 教程。 vid中的应用程序在我崩溃时运行良好。要么我错过了一些东西,但我检查了 10 次代码,或者视频的某些部分被跳过了。上传者好几天没有回复了:(

我几乎忘记了可能还有另一个原因导致了这种情况。在 TotalsActivity 中,从不使用方法 isFloat。 enter image description here

【问题讨论】:

读取堆栈跟踪。它告诉你java.lang.NumberFormatException: Invalid float: ""。这意味着您尝试使用""(一个空字符串)作为参数来执行Float.parseFloat。由于无法将其转换为浮点值,因此会出现异常。找出你传递空字符串的原因。 仅当 str 不为空时才解析,只需检查 if (!TextUtils.isEmpty(str.trim())) 然后解析 float。 如果我点击一个项目就会有价值,这就是为什么我有这个 test = st.nextElement().toString().substring(0,1);来自 MyApp 和字符串标记器。到目前为止,我设法显示单击的项目,但仍然无法解析计算。现在它说 Invalid float: "-" 破折号是列表中每一行的第一个字符。 :// 【参考方案1】:

如果您仔细阅读了错误日志,那就很容易了。无论如何。只需替换下面的代码

package edu.sti.snapchit;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.util.StringTokenizer;
import java.lang.String;


public class TotalsActivity extends AppCompatActivity

MyApp mApp;
EditText et_summary;
TextView tv_total;
Button btn_code;

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.totals);
    btn_code = (Button) findViewById(R.id.btn_code);
    mApp=((MyApp)getApplicationContext());
    et_summary = (EditText) findViewById(R.id.et_summary);
    tv_total = (TextView) findViewById(R.id.tv_total);
    et_summary.setText(mApp.getGlobalVarValue());
    String str = mApp.getGlobalVarValue();
    StringTokenizer st = new StringTokenizer(str,"Php");
    String test="";
    float total=0;
    int count =0;

    while(st.hasMoreElements())
    
        test = st.nextElement().toString().substring(0,1);
        if(count>0 && test !=null && !test.isEmpty())
            total += Float.parseFloat(test);
           
        count++;
    

    tv_total.setText("Total:" + total+"");
    mApp.setGlobalClear();
    btn_code.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 

            Intent intent = new Intent(TotalsActivity.this, GeneratorActivity.class);
            startActivity(intent);
        
    );




public boolean isFloat(String input)


    if(input.isEmpty() || input == null)
       return false;

    try
    
        Float.parseFloat(input);
        return true;
    
    catch(Exception e)
    
        return false;
    



【讨论】:

谢谢,但它仍然崩溃。哦,我忘了它也有警告说方法 isFloat 从未使用过。 :// 先生没有任何改变 :(

以上是关于Android:根据列表视图中点击的项目计算价格。应用程序在总活动 Logcat 中崩溃:无效浮点数:“”的主要内容,如果未能解决你的问题,请参考以下文章

点击listview,android studio

Android:自定义列表视图列表元素点击

识别一个按钮点击列表视图android

如何从列表视图中的项目单击中获取歌曲在android中

如何在android中获取特定列表视图项目的ID?

将数组列表中的数据显示到列表视图,计算每个重复对象并显示为一个对象