我想计算工作时间和挣来的现金(让我们说它每小时20英里-这就是为什么我在我的申请中乘以20 )。
我使用SharedPreferences,这样我就可以从应用程序中出来,它仍然记得当我按下“开始”按钮时,我也在使用Calendar.getInstance(),但是当我使用12小时格式时,我将不会有计算工作时间的问题(如果我在上午8点开始,晚上9点结束,那么工作时间将被减去start,9-8,这是一个小时,所以这将是错误的)。
一开始我使用了INTs,但是我一直工作到零小时,因为您不能在INTs中工作0.3小时,它会将它减少到零,我更改为Doubles,但令人惊讶的是SharedPreferences中没有getDouble或putDouble,所以我切换到Floats,但是现在我收到错误,应用程序崩溃。
这里是我的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
prefs = getSharedPreferences("myPrefsKey", 0);
textView = (TextView) findViewById(R.id.textView);
buttonStart = (Button) findViewById(R.id.start);
buttonStart.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Log.d(TAG, "onClick: starting");
c = Calendar.getInstance();
begmin = c.get(Calendar.MINUTE);
beghour = c.get(Calendar.HOUR_OF_DAY);
SharedPreferences.Editor edit = prefs.edit();
edit.putInt("key1", begmin);
edit.putInt("key2", beghour);
}
});
buttonStop = (Button) findViewById(R.id.stop);
buttonStop.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Log.d(TAG, "onClick: stopping");
Calendar c = Calendar.getInstance();
finmin = c.get(Calendar.MINUTE);
finhour = c.get(Calendar.HOUR_OF_DAY);
if (finhour >= beghour)
workhour = finhour - beghour;
else
workhour = 12 - beghour + finhour;
workmin = finmin - begmin;
hourcashto = (float)(workhour * 20);
mincashto = (float)(20 * (workmin / 60));
cashto = hourcashto + mincashto;
cash = prefs.getFloat("key", 0);
cash = cash + cashto;
SharedPreferences.Editor edit = prefs.edit();
edit.putFloat("key", cash);
edit.commit();
textView.setText("cash now: " + cashto + " cash total including today: " + cash + " \n" + "Time today: " + workhour + ":" + workmin);
}
});
}这里是Logcat输出:
09-01 19:44:19.811 17344-17344/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: firstappdevelopment.work, PID: 17344
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Float
at android.app.SharedPreferencesImpl.getFloat(SharedPreferencesImpl.java:253)
at firstappdevelopment.work.MainActivity$2.onClick(MainActivity.java:57)
at android.view.View.performClick(View.java:5254)
at android.view.View$PerformClick.run(View.java:21179)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6837)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:115)很抱歉,如果它是半个logcat,我使用搜索"MainActivity“,因为在中有自动滚动,我无法到达崩溃和复制。线MainActivity.java:57 refers to:
cash = prefs.getFloat("key", 0);据我所知,它说现金是一个int,但是看看我的构造函数(?):
private static final String TAG = "ServicesDemo";
private Button buttonStart, buttonStop;
private int begmin, beghour, finmin, finhour, workhour, workmin;
private float cash, cashto, hourcashto, mincashto;
private Calendar c;
private TextView textView;
private SharedPreferences prefs;谢谢大家的帮助。
编辑,完整的Code+XML
package firstappdevelopment.work;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.Calendar;
public class MainActivity extends Activity {
private static final String TAG = "ServicesDemo";
private Button buttonStart, buttonStop;
private int begmin, beghour, finmin, finhour, workhour, workmin;
private float cash, cashto, hourcashto, mincashto;
private Calendar c;
private TextView textView;
private SharedPreferences prefs;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
prefs = getSharedPreferences("myPrefsKey", 0);
textView = (TextView) findViewById(R.id.textView);
buttonStart = (Button) findViewById(R.id.start);
buttonStart.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Log.d(TAG, "onClick: starting");
c = Calendar.getInstance();
begmin = c.get(Calendar.MINUTE);
beghour = c.get(Calendar.HOUR_OF_DAY);
SharedPreferences.Editor edit = prefs.edit();
edit.putInt("key1", begmin);
edit.putInt("key2", beghour);
}
});
buttonStop = (Button) findViewById(R.id.stop);
buttonStop.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Log.d(TAG, "onClick: stopping");
Calendar c = Calendar.getInstance();
finmin = c.get(Calendar.MINUTE);
finhour = c.get(Calendar.HOUR_OF_DAY);
if (finhour >= beghour)
workhour = finhour - beghour;
else
workhour = 12 - beghour + finhour;
workmin = finmin - begmin;
hourcashto = (float)(workhour * 20);
mincashto = (float)(20 * (workmin / 60));
cashto = hourcashto + mincashto;
cash = prefs.getFloat("key", 0f);
cash = cash + cashto;
SharedPreferences.Editor edit = prefs.edit();
edit.putFloat("key", cash);
edit.commit();
textView.setText("cash now: " + cashto + " cash total including today: " + cash + " \n" + "Time today: " + workhour + ":" + workmin);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}XML:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<Button
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="START"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Total:"
android:layout_alignTop="@+id/stop"
android:layout_toRightOf="@+id/stop"
android:layout_toEndOf="@+id/stop"
/>
<Button
android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="STOP"
android:layout_alignTop="@+id/start"
android:layout_toRightOf="@+id/start"
android:layout_toEndOf="@+id/start" />
</RelativeLayout>发布于 2015-09-01 17:13:09
所以你知道问题就在这里
cash = prefs.getFloat("key", 0)我觉得你的代码很好!但是,正如您所说的,您最初是在"key"的共享首选项中存储一些整数值。你去掉那些值了吗?我建议您尝试将cash = prefs.getFloat("key", 0)更改为cash = prefs.getFloat("key_new", 0)。这可能是愚蠢的问题,你忽略了!
注意,如果cash = prefs.getFloat("key_new", 0)中存在0、0f或0.0f的问题,那么它将给出编译时错误。
发布于 2015-09-01 16:51:27
因此,从接收到的ClassCastException错误中,如果0值不存在,则尝试从SharedPreferences传递一个默认值。
将cash = prefs.getFloat("key", 0)更改为cash = prefs.getFloat("key", 0.0)
发布于 2015-09-01 17:02:16
由于您有此例外:
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Float你的问题是:
cash = prefs.getFloat("key", 0);必须:
cash = prefs.getFloat("key", 0.0f);或者您的变量cash被定义为int!你必须改为:
float cash;有关getFloat()方法的更多信息。
https://stackoverflow.com/questions/32336952
复制相似问题