2011-01-26 5 views
4

J'ai essayé d'utiliser une activité de préférence android, j'ai tout mis en place, mais j'ai du mal à récupérer la préférence des utilisateurs. Pour être précis, c'est deux préférences d'édition, la durée du terme et la durée de l'année, que je veux récupérer les valeurs de int pour que je puisse les utiliser dans un calcul dans une autre activité.Je ne peux pas comprendre comment utiliser un android PréférenceActivité

Chaque exemple que je trouve est différent et je ne peux pas vraiment trouver une explication claire. Je vais poster la classe et la méthode que j'utilise ci-dessous, je sais que le code qui est là n'est pas correct mais j'ai l'impression d'avoir tout chamboulé de toutes mes manières maintenant et je n'arrive pas à le comprendre. Cette ligne en particulier je ne crois pas est correcte: SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); et je ne comprends pas vraiment les activités de préférences dans leur ensemble, ils ne semblent pas fonctionner comme je l'attendrais. Tout conseil serait vraiment génial! J'ai jonglé avec les mêmes lignes de code pendant des jours.
Merci.

Mon activité de préférences ressemble à ceci:

package com.geistware.studentbudgetapp; 

import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.preference.EditTextPreference; 
import android.preference.PreferenceActivity; 
import android.preference.PreferenceManager; 
import android.text.method.DigitsKeyListener; 
import android.util.Log; 

public class UserPrefs extends PreferenceActivity { 
    public int termLength = 1; 
    public int yearLength = 1; 

    @Override //OnCreate never runs, why? 
    protected void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.setup); 

     EditTextPreference usersTermLength =(EditTextPreference) 
     findPreference(getString(R.string.term_length_set)); //finds 
     //the edittext box by its key, term_length_set 
     usersTermLength.getEditText().setKeyListener(DigitsKeyListener. 
      getInstance()); //DigitsKeyListener only allows digits to be typed in 
     Log.v("UserPrefs", "UsersTermLength: " + usersTermLength); 

     EditTextPreference usersYearLength =(EditTextPreference) 
      findPreference(getString(R.string.year_length_set)); 
     usersYearLength.getEditText().setKeyListener(DigitsKeyListener. 
      getInstance()); 
    } 
} 

et je veux être en mesure de récupérer les utilisateurs termLength et yearLength (comme ints) dans cette méthode:

public float alterForFrequency(float enteredAmount, String spinnerPosition){ 
    //get user preferences (not working) 
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 

    String termKey = getString(R.string.term_length_set, ""); 
    String yearKey = getString(R.string.year_length_set, ""); 

    int termLength = prefs.getInt(termKey, 1); 
    int yearLength = prefs.getInt(yearKey, 1); 

    Log.v("alterForFrequency", "userprefs: " + termLength + yearLength); 

    //perform calculations for monthly/temly/yearly 
    if(spinnerPosition.equals("Monthly")){ 
     usersAmount = ((enteredAmount/31)* 7); 
     Log.v("FiscFreq", "revisingAmount=" + usersAmount); 
    } 
    else if(spinnerPosition.equals("Termly")){ 
     usersAmount = (enteredAmount/termLength); 
     Log.v("FiscFreq", "revisingAmount=" + usersAmount); 
    } 
    else if(spinnerPosition.equals("Yearly")){ 
     usersAmount = (enteredAmount/yearLength); 
    } 
    else{ 
     usersAmount = enteredAmount; 
    } 

    currencyRevisedAmount = toCurrency(usersAmount); //drops the unwanted digits 
    return currencyRevisedAmount; 
} 

Je suis en fait créer une instance de FiscalFrequency pour utiliser alterForFrequency dans une activité appelée Keypad comme suit:

public class Keypad extends Activity { ..... 
    public float reviseOnSpinnerPos(){ 
    enteredAmount = Float.valueOf(userAmount.getText().toString()); 
    FiscalFrequency ff = new FiscalFrequency(); 
    revisedAmount = ff.alterForFrequency(enteredAmount, spinnerPosition); 
    return revisedAmount; 
    } 
} 
+0

Quel est le problème ou l'erreur qui se produit après avoir lu les préférences de pref? – Janusz

+0

@Janusz: bien avec le code mis en place ci-dessus j'obtiens cette erreur sur la ligne 'SharedPreferences Prefs = ..': La méthode getDefaultSharedPreferences (Context) dans le type PreferenceManager n'est pas applicable pour les arguments (FiscalFrequency). aussi la méthode getString, pour obtenir les clés xml editText, n'est pas définie pour une raison quelconque. Si je mélange des choses à propos de (en mettant tout dans UserPrefs et en demandant à mes autres classes de l'étendre pour accéder aux variables, j'obtiens une exception NumberFormatException.) – Holly

+0

Je suis novice dans ce domaine et normalement j'essayerais de résoudre cela en utilisant des points de rupture. ne semble pas vraiment courir les préférences sur créer du code je suis à une perte.Je pense que j'ai juste besoin de quelqu'un pour tout réorganiser correctement, mais il pourrait être plus compliqué, donc j'apprécie l'aide – Holly

Répondre

4

getDefaultSharedPreferences (Context) utilise l'instance Context (comme indiqué), et ce que vous fournissez n'est pas un contexte. Si votre classe FiscalFrequency est situé dans l'activité et n'est pas statique, essayez d'appeler

getDefaultSharedPreferences(UserPrefs.this) 

Ou quelle que soit l'activité que vous êtes actuellement (puisque l'activité étend Contexte)

Sinon, Contexte de l'instance d'alimentation lorsque vous créez une instance de votre classe FiscalFrequency. Une façon est de le faire par le constructeur.

P.S. Serait plus facile si vous publiez une partie du code, où vous créez une instance de FiscalFrequency et l'activité où cela se produit.

EDIT: Dans votre classe FiscalFrequency procédez comme suit:

public class FiscalFrequency { 
    public FiscalFrequency(final Context context) { 
     this.context = context; 
    } 
    private Context context; 
    ... the rest of your class ... 
} 

Et yhen vous pouvez créer une instance de votre FiscalFrequency que lors de l'alimentation contexte à elle.

FiscalFrequency ff = new FiscalFrequency(this); 

(« this » est une référence à la classe que nous sommes actuellement, et cette classe dans votre cas est l'activité, et l'activité est un contexte.

Et enfin, dans votre alterForFrequency() faire :

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 

« contexte » est une référence au contexte (votre classe d'activité dans votre cas), que vous avez fourni lors de la création d'une instance de FiscalFrequency.

+0

Désolé, mais pourriez-vous développer sur ce point, Je viens d'apprendre et ma compréhension de Context est évidemment encore assez médiocre:/Comment pourrais-je fournir le contexte à travers un constructeur? Aussi vous avez raison! Je vais ammend mon poste ci-dessus avec la partie de code en utilisant alterForFrequency po Je suis en fait en l'utilisant dans une activité appelée Keypad – Holly

+0

J'ai édité ma réponse initiale;) –

+0

Merci, votre réponse a été incroyablement utile :) – Holly

1

Essayez d'ajouter un écouteur dans le fond de la méthode onCreate dans la userprefs classe:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 
prefs.registerOnSharedPreferenceChangeListener(this); 

Cela entraînera les préférences à modifier à la volée lorsque l'utilisateur modifie les valeurs.

Questions connexes