我试图实现prefs并解决我以前遇到的问题,但它只是引起了另一个问题 - 一个prefs问题。它似乎表明它来自我在onCreate()方法上的行。
特别是在日志中它说了以下内容 -
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.your.app/com.your.app.activity}: java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String
at android.app.SharedPreferencesImpl.getString(SharedPreferencesImpl.java:225)
at com.your.app.activity.onCreate(ShopActivity.java:105*At the oncreate shown*)
所以我试图解决这个问题,但我找不到解决方案。我正在用代码制作游戏,并设法创建一个硬币系统,您可以在下面看到,还涉及使用标签系统滚动汽车。问题是,每次加载该活动时,它似乎都会显示该错误。 我之前没有遇到过这个问题,并且使用了不同的方法。这是代码。谢谢你的帮助。在尝试修复错误时也编辑了代码。 -
对于onCreate方法 -
prefs = this.getSharedPreferences(
"com.this.app", Context.MODE_PRIVATE);
status1 = prefs.getString(savelocked,"Locked");
status2 = prefs.getString(savelocked2,"Locked");
status3 = prefs.getString(savelocked3,"Locked");
status4 = prefs.getString(savelocked4,"Locked");
status5 = prefs.getString(savelocked5,"Locked");
locked = status1;
locked2 = status2;
locked3 = status3;
locked4 = status4;
locked5 = status5;
对于OnDestroy方法 -
SharedPreferences.Editor prefsEditor = prefs.edit();
prefsEditor.putString(savelocked,status1);
prefsEditor.putString(savelocked2,status2);
prefsEditor.putString(savelocked3,status3);
prefsEditor.putString(savelocked4,status4);
prefsEditor.putString(savelocked5,status5);
prefsEditor.apply();
有关问题的实际代码也在onCreate中 -
final ImageView buy = (ImageView) findViewById(R.id.imageView26);
final ImageView car = (ImageView) findViewById(R.id.imageView9);
car.setTag("sportscar1");
final ImageView use = (ImageView) findViewById(R.id.imageView5);
buy.setImageResource(R.drawable.bull);
if(car.getTag()=="sportscar1") {
if (locked.equals("Locked")) {
use.setImageResource(R.drawable.bull2);
}
}else{use.setImageResource(R.drawable.use);}
final ImageView right = (ImageView) findViewById(R.id.imageView25);
final ImageView left = (ImageView) findViewById(R.id.imageView24);
buy.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (car.getTag() == "sportscar1") {
if (locked.equals("Locked") && GameView.coinz >= 1) {
status1="Unlocked";
Colors.color1 = "sportscar1";
GameView.coinz = GameView.coinz - 1;
Toast.makeText(context, " - 1 Car Token",
Toast.LENGTH_SHORT).show();
Toast.makeText(context, "You just bought the sports car!",
Toast.LENGTH_LONG).show();
use.setImageResource(R.drawable.use);
buy.setImageResource(R.drawable.bull);
} else {
Toast.makeText(context, " Not enough Car Tokens.",
Toast.LENGTH_SHORT).show();
}
}
});
left.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (car.getTag() == "sportscar1") {
buy.setImageResource(R.drawable.bull);
use.setImageResource(R.drawable.bull2);
car.setTag("sportscar2");
if (locked2.equals("Locked")) {
car.setImageResource(R.drawable.sportscar2_locked);
buy.setImageResource(R.drawable.buy);
use.setImageResource(R.drawable.bull2);
} else if (locked2.equals("Unlocked")) {
car.setImageResource(R.drawable.sportscar2_show);
buy.setImageResource(R.drawable.bull);
use.setImageResource(R.drawable.use);
}
}
});
right.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (car.getTag() == "sportscar1") {
buy.setImageResource(R.drawable.bull);
use.setImageResource(R.drawable.bull2);
car.setTag("thecar1");
if (locked5.equals("Locked")) {
car.setImageResource(R.drawable.thecar1_locked);
buy.setImageResource(R.drawable.buy);
use.setImageResource(R.drawable.bull2);
} else if (locked5.equals("Unlocked")) {
car.setImageResource(R.drawable.thecar1_show);
buy.setImageResource(R.drawable.bull);
use.setImageResource(R.drawable.use);
}
}
}
});
use.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (car.getTag() == "sportscar2") {
Colors.color1 = "sportscar2";
status2="Unlocked";
Toast.makeText(context, "You just selected the second sports car!",
Toast.LENGTH_LONG).show();
buy.setImageResource(R.drawable.bull);
use.setImageResource(R.drawable.use);
}
}
});
实例变量(在活动开始时) -
private String savelocked = "Locked or Unlocked";
private String savelocked2 = "Locked or Unlocked";
private String savelocked3 = "Locked or Unlocked";
private String savelocked4 = "Locked or Unlocked";
private String savelocked5 = "Locked or Unlocked";
public String status1 = "Locked";
public String status3 = "Locked";
public String status2 = "Locked";
public String status4 = "Locked";
public String status5 = "Locked";
public String locked;
public String locked2;
public String locked3;
public String locked4;
public String locked5;
private static SharedPreferences prefs;
感谢您的帮助。我在使用==时没有遇到过这个问题,而这次我正在使用.equals()。对不起冗长的代码。请帮助。所有帮助表示赞赏。感谢您的时间。 编辑 - 许多代码已被截止,上面的代码指的是一般含义。 编辑2 - 实例化的变量也包括在内。 再次感谢您的帮助。
答案 0 :(得分:3)
(很抱歉将此添加为答案,但我没有足够的代表添加评论) 还有其他行你应该使用“equals()”:
在你所拥有的每个地方:
if (car.getTag()=="sportscar1") { ...
你应该使用(或“ sportscar2 ”,或任何字符串)
if (car.getTag().equals("sportscar1")) { ...
请记住,Java中的字符串也是对象,因此无法像这样对它们进行比较,因为它们不是同一对象的完全相同的实例。因此,您应该使用.equals()
答案 1 :(得分:1)
欢迎您,Game Programmer。您获得的错误意味着具有该名称的首选变量存在,但由于某种原因,它找到的数据类型不是字符串。
将onCreate中的代码更改为:
status1 = prefs.getString("savelocked", "Locked");
和你的onDestroy中的那些:
prefsEditor.putString("savelocked", status1);
只是在不同的首选项变量中存储和检索相同的信息。老实说,从我在代码中看到的内容来看,我仍然不知道你为什么会在第一时间得到这个错误。但如果它有效,它就有效。