NullPointerException dans SharedPreferences Android
Ma première fois avec sharedPreferences et je n'arrive pas à sortir de cette erreur. J'ai un sous-menu qui est censée permettre à l'utilisateur de définir leur région. Ce qui devrait ouvrir la région correcte de l'activité et être stockés et rappelés lorsque l'application est ouverte de nouveau.
J'ai été tourner en rond plusieurs fois donc le code sera un peu bizarre. J'ai mis l'accent sur le changement de notre part (par défaut)au royaume-UNI.
Dans le DDMS j'obtiens ceci:
05-13 11:22:39.344: ERROR/AndroidRuntime(960): java.lang.NullPointerException
05-13 11:22:39.344: ERROR/AndroidRuntime(960): at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:146)
05-13 11:22:39.344: ERROR/AndroidRuntime(960): at com.silifeform.android.Prefs.editRegion(Prefs.java:29)
05-13 11:22:39.344: ERROR/AndroidRuntime(960): at com.silifeform.android.dog.onOptionsItemSelected(dog.java:344)
Mon code est: est-ce
public class Prefs extends Activity {
public static final String PREFS_NAME="LocalePrefs";
private String region;
public boolean isUk;
public boolean isUs;
public boolean isEu;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
//restore prefs
SharedPreferences settings= getSharedPreferences(PREFS_NAME,0);
String myRegion = settings.getString(region,"us");
this.region=myRegion;
changeLocale(getRegion());
}
public void editRegion(String sregion) {
//The error occurs here:
SharedPreferences settings = getSharedPreferences(PREFS_NAME,0);
SharedPreferences.Editor ed = settings.edit();
ed.clear();
ed.putString(region,sregion);
ed.commit();
}
public String getRegion(){
SharedPreferences settings= getSharedPreferences(PREFS_NAME,0);
String myRegion = settings.getString(region,"us");
String gRegion=myRegion;
return gRegion;
}
public void changeLocale(String locale){
try{
String l= locale;
if(l==("us")){
this.isUs=true;
Toast.makeText(this, "Us region P selected", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Prefs.this, dog.class);
startActivity(intent);
}
if(l.equals("uk")){
this.isUk=true;
//Toast.makeText(this, "UK region selected", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Prefs.this, cat.class);
startActivity(intent);
}
}catch (NullPointerException e){
//what to do here?
finish();
}
}
@Override
protected void onStop() {
super.onStop();
SharedPreferences settings = getPreferences(0);
SharedPreferences.Editor ed = settings.edit();
ed.putString(region,region);
ed.commit();
}
Mon sous-menu code dans la classe chien ressemble à ceci:
public boolean onOptionsItemSelected(MenuItem item){
Prefs pob = new Prefs();
switch (item.getItemId()){
//-------Options menu----------
case R.id.about:
//Toast.makeText(this, "About menu", Toast.LENGTH_SHORT).show();
//showAbout();
return true;
case R.id.locale:
//Toast.makeText(this, "Locale menu", Toast.LENGTH_SHORT).show();
return true;
//-----Sub menu----------
case R.id.uk_item:
Toast.makeText(this, "UK selected", Toast.LENGTH_SHORT).show();
pob.editRegion("uk");
pob.changeLocale("uk");
finish();
return true;
case R.id.us_item:
Toast.makeText(this, "US already selected", Toast.LENGTH_SHORT).show();
pob.changeLocale("us");
//finish();
return true;
default :
return super.onOptionsItemSelected(item);
}
Grâce
source d'informationauteur Broo
Vous devez vous connecter pour publier un commentaire.
getSharedPreferences()
ne peut être appelée aprèsonCreate()
a été appelée sur unActivity
. VotrePrefs
classe est étrangement utilisé dansonOptionsItemSelected()
. En général, vous n'avez pas instancier activités. Si votrePrefs
classe n'est pas une Activité, mais une classe d'aide pour accéder aux préférences, passer uneContext
objet à vos méthodes, comme ceci:et de l'appeler par:
de votre
onOptionsItemSelected()
méthode.J'ai eu la même chose, et je n'étais pas en mesure d'obtenir une réponse précise pour
mon problème jusqu'à ce que je suis venu dans Stephan réponse. Mais je tiens à le rendre encore plus clair pour la prochaine à venir:
J'essayais d'obtenir un accès à l'partagé préférences en dehors de l'activité à l'aide d'une classe externe qui n'a pas étendu la
Activity
Classe. Cela m'a causé le mêmejava.lang.NullPointerException
.Mon Activité Principale a été la création d'un objet qui a besoin de la
Context
pour accéder à la préférences:Comme vous avez pu voir la MyClass création est faite avant onCreate est appelé, ce qui a conduit le contexte, d'être "mi-Cuit" et de jeter le
java.lang.NullPointerException
.Pourquoi "Mi-Cuit"? Lors du débogage le problème, j'ai eu un point d'arrêt sur la ligne
et lors de l'inspection le paramètre de contexte, j'ai pu voir de ses valeurs (certains de ceux de toute façon) ce qui donne la fausse croyance que le paramètre a été entièrement initialisé.
Déplacement de l'initialisation de myClass dans l'événement onCreate résolu le problème:
getSharedPrefrences()
besoinContext
. Utiliser comme ceci: