2013-06-27 3 views
4

Mon application a beaucoup de cases à cocher, un spinner, edittext et un bouton. Lorsque je choisis un élément du spinner et que j'entre une certaine valeur et que j'appuie sur un bouton, un certain texte de case à cocher change. Maintenant j'ai ajouté des préférences partagées et j'ai deux problèmes.Les préférences partagées ne fonctionnent pas, les valeurs par défaut

Le premier problème est que lorsque j'essaie d'utiliser des préférences partagées, l'application se bloque (dès que je lance l'activité contenant ces préférences partagées).

private String getItemQuantity(String key){ 
    SharedPreferences itemQuantitySP = getApplicationContext().getSharedPreferences("bifrostPrefs", android.content.Context.MODE_PRIVATE); 
    String sp1 = "sp1"; 
    return itemQuantitySP.getString(key, sp1); 
} 
private void saveItemQuantity(String key, String value){ 
    SharedPreferences itemQuantitySP = getApplicationContext().getSharedPreferences("bifrostPrefs", android.content.Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = itemQuantitySP.edit(); 
    editor.putString(key, value); 
    editor.commit(); 
} 

sharedpreferences Enregistrement:

if (Integer.parseInt(quantityEditText.getText().toString()) == 250) 
{ 
    cb4.setText("Elaborate Totem (" + item1 + "/250)"); 
    saveItemQuantity("cb4", cb4.getText().toString()); 
    cb4.setChecked(true); 
} 
... //REST OF THE CODE 

Obtenir sharedpreferences:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_bifrost); 

    getItemQuantity("cb4"); 
... //REST OF THE CODE 

Le deuxième problème est que j'ai beaucoup de cases à cocher et la mise en valeur par défaut pour chacun d'entre eux seraient très long. Alors, y a-t-il un moyen de simplement lire la valeur par défaut de XML? Comme vous pouvez le voir, pour l'instant, j'ai créé une nouvelle variable appelée sp1 et l'ai définie comme valeur par défaut, mais bien sûr, je veux m'en débarrasser.

fichier Logcat:

06-27 16:31:44.782: E/AndroidRuntime(13139): FATAL EXCEPTION: main 
06-27 16:31:44.782: E/AndroidRuntime(13139): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.matthewstudios.gw2legendary/com.example.gw2legendary.Bifrost}: java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String 
06-27 16:31:44.782: E/AndroidRuntime(13139): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
06-27 16:31:44.782: E/AndroidRuntime(13139): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
06-27 16:31:44.782: E/AndroidRuntime(13139): at android.app.ActivityThread.access$600(ActivityThread.java:141) 
06-27 16:31:44.782: E/AndroidRuntime(13139): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
06-27 16:31:44.782: E/AndroidRuntime(13139): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-27 16:31:44.782: E/AndroidRuntime(13139): at android.os.Looper.loop(Looper.java:137) 
06-27 16:31:44.782: E/AndroidRuntime(13139): at android.app.ActivityThread.main(ActivityThread.java:5041) 
06-27 16:31:44.782: E/AndroidRuntime(13139): at java.lang.reflect.Method.invokeNative(Native Method) 
06-27 16:31:44.782: E/AndroidRuntime(13139): at java.lang.reflect.Method.invoke(Method.java:511) 
06-27 16:31:44.782: E/AndroidRuntime(13139): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
06-27 16:31:44.782: E/AndroidRuntime(13139): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
06-27 16:31:44.782: E/AndroidRuntime(13139): at dalvik.system.NativeStart.main(Native Method) 
06-27 16:31:44.782: E/AndroidRuntime(13139): Caused by: java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String 
06-27 16:31:44.782: E/AndroidRuntime(13139): at android.app.SharedPreferencesImpl.getString(SharedPreferencesImpl.java:224) 
06-27 16:31:44.782: E/AndroidRuntime(13139): at com.example.gw2legendary.Bifrost.getItemQuantity(Bifrost.java:849) 
06-27 16:31:44.782: E/AndroidRuntime(13139): at com.example.gw2legendary.Bifrost.onCreate(Bifrost.java:152) 
06-27 16:31:44.782: E/AndroidRuntime(13139): at android.app.Activity.performCreate(Activity.java:5104) 
06-27 16:31:44.782: E/AndroidRuntime(13139): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
06-27 16:31:44.782: E/AndroidRuntime(13139): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
06-27 16:31:44.782: E/AndroidRuntime(13139): ... 11 more 
06-27 16:31:49.391: E/fb4a(:<default>):MmsConfig(13225): MmsConfig.loadMmsSettings mms_config.xml missing uaProfUrl setting 

Une partie du code:

public void submitQuantityButton (View v){ 
    final Spinner sItems = (Spinner)findViewById(R.id.spinner1); 
    final Context context = this; 
    final CheckBox cb4 = (CheckBox) findViewById(R.id.checkBox4); 
    final CheckBox cb5 = (CheckBox) findViewById(R.id.checkBox5); 
    final CheckBox cb6 = (CheckBox) findViewById(R.id.checkBox6); 
    final CheckBox cb7 = (CheckBox) findViewById(R.id.checkBox7); 
    final CheckBox cb9 = (CheckBox) findViewById(R.id.checkBox9); 
    final CheckBox cb10 = (CheckBox) findViewById(R.id.checkBox10); 
    final CheckBox cb11 = (CheckBox) findViewById(R.id.checkBox11); 
    final CheckBox cb12 = (CheckBox) findViewById(R.id.checkBox12); 
    final CheckBox cb13 = (CheckBox) findViewById(R.id.checkBox13); 
    final CheckBox cb15 = (CheckBox) findViewById(R.id.checkBox15); 
    final CheckBox cb16 = (CheckBox) findViewById(R.id.checkBox16); 
    final CheckBox cb17 = (CheckBox) findViewById(R.id.checkBox17); 
    final CheckBox cb18 = (CheckBox) findViewById(R.id.checkBox18); 
    final CheckBox cb25 = (CheckBox) findViewById(R.id.checkBox25); 
    final CheckBox cb27 = (CheckBox) findViewById(R.id.checkBox27); 
    final CheckBox cb28 = (CheckBox) findViewById(R.id.checkBox28); 
    final CheckBox cb29 = (CheckBox) findViewById(R.id.checkBox29); 
    final CheckBox cb30 = (CheckBox) findViewById(R.id.checkBox30); 
    final CheckBox cb31 = (CheckBox) findViewById(R.id.checkBox31); 
    final CheckBox cb33 = (CheckBox) findViewById(R.id.checkBox33); 
    final CheckBox cb34 = (CheckBox) findViewById(R.id.checkBox34); 
    final CheckBox cb35 = (CheckBox) findViewById(R.id.checkBox35); 
    final CheckBox cb36 = (CheckBox) findViewById(R.id.checkBox36); 
    final CheckBox cb37 = (CheckBox) findViewById(R.id.checkBox37); 

    //WRONG VALUE ERROR 
    final AlertDialog.Builder wrongValueBuilder = new AlertDialog.Builder(context); 
    wrongValueBuilder.setTitle("Warning"); 
    wrongValueBuilder.setMessage("The value you entered is too high!"); 
    wrongValueBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.cancel(); 
     } 
    }); 

    //EMPTY TEXT ERROR 
    final AlertDialog.Builder emptyETextErrorBuilder = new AlertDialog.Builder(context); 
    emptyETextErrorBuilder.setTitle("Warning"); 
    emptyETextErrorBuilder.setMessage("Please enter a value before pressing this button"); 
    emptyETextErrorBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.cancel(); 
     } 
    }); 

      final int position = sItems.getSelectedItemPosition(); 
      EditText quantityEditText = (EditText)findViewById(R.id.editText1); 

      switch (position){ 
      case 0: 
       AlertDialog.Builder spinnerErrorBuilder = new AlertDialog.Builder(context); 
       spinnerErrorBuilder.setTitle("Warning"); 
       spinnerErrorBuilder.setMessage("Please choose an item from the list above and then enter a certain value"); 
       spinnerErrorBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 

        @Override 
        public void onClick(DialogInterface dialog, int id) { 
         dialog.cancel(); 
        } 
       }); 
       AlertDialog spinnerError = spinnerErrorBuilder.create(); 
       spinnerError.show(); 
       break; 
      case 1: 
       String item1 = quantityEditText.getText().toString(); 
       if (item1.matches("")) 
       { 
        AlertDialog emptyETextError = emptyETextErrorBuilder.create(); 
        emptyETextError.show(); 
       } 
       else 
       { 
        if (Integer.parseInt(quantityEditText.getText().toString()) <= 250) 
        { 
         if (Integer.parseInt(quantityEditText.getText().toString()) == 250) 
         { 
          cb4.setText("Elaborate Totem (" + item1 + "/250)"); 
          saveItemQuantity("cb4", cb4.getText().toString()); 
          cb4.setChecked(true); 
         } 
         else 
         { 
          cb4.setText("Elaborate Totem (" + item1 + "/250)"); 
          saveItemQuantity("cb4", cb4.getText().toString()); 
          cb4.setChecked(false); 
         } 
        } 
+0

Pourriez-vous poster une erreur que vous obtenez en utilisant 'SharedPreferences'? –

+1

Afficher le code original – Blackbelt

+0

Publié le fichier logcat, toujours s'interroger sur les valeurs par défaut tho. @blackbelt voulez-vous dire en fait le code java entier? Parce qu'il est vraiment très long – Guy

Répondre

4

Le stacktrace, et les 3 lignes suivantes, montre où est le problème:

06-27 16:31:44.782: E/AndroidRuntime(13139): Caused by: java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.String 
06-27 16:31:44.782: E/AndroidRuntime(13139): at android.app.SharedPreferencesImpl.getString(SharedPreferencesImpl.java:224) 
06-27 16:31:44.782: E/AndroidRuntime(13139): at com.example.gw2legendary.Bifrost.getItemQuantity(Bifrost.java:849) 

Vous avez un problème dans le fichier Bifrost .java, à la ligne 849, dans la méthode getItemQuantity(). Et cela correspond à l'appel à la méthode getString(). C'est vraiment intéressant de regarder les 3 lignes et d'essayer de comprendre comment vous pouvez obtenir toutes ces informations, car vous devrez faire la même chose chaque fois que vous avez une exception dans votre code.

Ce que je peux supposer est que la valeur que vous essayez d'obtenir de l'SharedPreferences a été enregistré comme Boolean, et vous essayez de l'obtenir comme String, si vous avez cette ClassCastException. Il suffit de réviser la valeur que vous avez enregistrée dans les SharedPreferences avec cette clé. Pour plus d'informations, essayez d'apprendre à déboguer votre application et utilisez les points d'arrêt pour vérifier les valeurs des variables à un moment de l'exécution. Les points d'arrêt vous permettent d'arrêter l'exécution exactement où vous voulez et recherchent l'état et les valeurs de toutes les variables. Déboguer avec un IDE comme Eclipse ou NetBeans est vraiment facile et peut vous aider dans beaucoup de situations.

+0

Merci beaucoup pour votre réponse! Cela explique beaucoup mais je ne suis pas sûr de savoir comment "réviser" la valeur avec la clé, je suis assez nouveau à ce sujet, donc je ne suis pas complètement sûr de ce que cela signifie exactement. Pourrais-tu me dire? – Guy

+1

Par exemple, avant 'return itemQuantitySP.getString (clé, sp1);', vous pouvez ajouter une ligne comme: 'Map map = itemQuantitySP.getAll();' et ensuite obtenir la valeur avec la clé avec 'Object value = map.get (clé); Ensuite, vous pouvez vérifier la valeur avec le débogueur ou l'imprimer. Vous devrez trouver dans le code où vous enregistrez un booléen avec cette clé dans 'SharedPreferences'. – eternay

+0

Merci, je suis encore un peu confus à propos de tout ici puisque je suis un débutant mais je ferai plus de recherches et je ferai les choses au clair :) – Guy

0

Il devrait être évident que l'erreur est la lecture de la stacktrace:

java.lang.ClassCastException: java .lang.Boolean ne peut pas être converti en java.lang.String

Et oui vous pouvez lire defaul Les valeurs de t à partir d'un fichier XML, lisez arrays.xml et http://developer.android.com/guide/topics/resources/more-resources.html#TypedArray ici

+0

Merci pour votre réponse, pourriez-vous me dire comment j'aborderais la fixation de mon code? Je suis encore un débutant et je comprends ce que l'erreur dit mais je ne peux pas vraiment trouver la source principale et comment la réparer – Guy

+0

Dans votre logcat, après les 2 lignes que vous avez ajoutées dans votre question, vous avez un pile complète. Une ligne dans cette pile devrait faire référence à votre code, et cette ligne devrait inclure le numéro de ligne exact dans votre code où l'erreur se produit. Ensuite, vous pouvez déduire le code qui vous donne l'exception et essayer de comprendre pourquoi. Vous pouvez également ajouter la pile complète et indiquer la ligne de votre code afin que nous puissions savoir où chercher. – eternay

+0

Je pense que je comprends comment la stacktrace fonctionne maintenant, mais je ne peux pas vraiment pointer du doigt la ligne du code qu'elle affecte, j'ai posté toute la stacktrace. Merci beaucoup de m'avoir expliqué – Guy

Questions connexes