Prefs Error - Android'引起:java.lang.ClassCastException:java.lang.Boolean无法强制转换为java.lang.String'

时间:2016-05-21 19:11:07

标签: java android

我试图实现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 - 实例化的变量也包括在内。 再次感谢您的帮助。

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);

只是在不同的首选项变量中存储和检索相同的信息。老实说,从我在代码中看到的内容来看,我仍然不知道你为什么会在第一时间得到这个错误。但如果它有效,它就有效。