2016-05-21 29 views
-1

我試圖實現prefs並解決了我以前的問題,但它改爲它只是造成了另一個問題 - 一個偏好問題。它似乎表明它來自我放在onCreate()方法上的幾行。Prefs錯誤 - Android'引起:java.lang.ClassCastException:java.lang.Boolean不能轉換爲java.lang.String'

具體表現在記錄它下面說 -

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 - 也包括實例化的變量。 再次感謝您的幫助。

+3

這是太多的代碼。通過編寫一個最小的完整示例來幫助我們來幫助您,這個示例演示您遇到的問題。 (你甚至可能會發現確定這個過程可以幫助你自己解決問題。) – yshavit

+0

好的。謝謝。等一下。那時我會得到一般想法。謝謝。 –

+0

剛剛編輯。謝謝你的幫助。 –

回答

1

不客氣,遊戲程序員。您收到的錯誤意味着具有該名稱的首選項變量存在,但由於某種原因,它找到的數據類型不是字符串。

在你的onCreate更改代碼:

status1 = prefs.getString("savelocked", "Locked"); 

,並在您的onDestroy的那些到:

prefsEditor.putString("savelocked", status1); 

只是存儲和檢索在不同的偏好變量相同的信息。說實話,從我在代碼中看到的東西,我仍然不知道爲什麼你首先得到這個錯誤。但是,如果它有效,它就會起作用。

3

(對不起,添加爲一個答案,但我沒有足夠的代表處添加評論) 還有其他行,你應該使用「的equals()」太:

在每一個地方在這裏你有:

if (car.getTag()=="sportscar1") { ... 

(或 「sportscar2」,或任何字符串),你應該使用

if (car.getTag().equals("sportscar1")) { ... 

請請注意Java中的字符串也是對象,因此不能像這樣進行比較,因爲它們不是同一個對象的完全相同的實例。因此你應該使用.equals()

+0

感謝您的幫助,但這不是真正的問題。 –

+0

當然,我會嘗試。 –

+0

不,它沒有解決這個錯誤。 –

相關問題