2013-02-19 2 views
-2

Это save() метод в моем приложении:Использование getSharedPreferences android?

public void save() { 
    Context context; 
    SharedPreferences sp = context.getSharedPreferences("gameSave", 
      Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = sp.edit(); 

    editor.putInt("X", player.getX()); 
    editor.putInt("Y", player.getY()); 
    editor.putInt("level", player.getLevel()); 
    editor.putFloat("xp", player.getXp()); 
    editor.commit(); 
} 

Я пытался получить эту работу на некоторое время теперь, но getSharedPreferences (String name, int mode) не работает для меня. Это не придумано, context.getSharedPreferences() работает, но это дает NullPointerException, я думаю, из-за моего контекста. Я пробовал save(Context context){} как конструктор, но вызов этого из другого метода с контекстом, объявленным внутри этого метода, тоже не работает. Я просмотрел множество примеров, но никто из них не работал на меня. Итак, как я могу получить getSharedPreferences()?

EDIT: У меня есть класс GameScreen и класс SaveManager. Когда я сохраняю в Gamescreen это код, я использую:

Savemanager savemanager; 
savemanager.save(); 
state = GameState.Running; 

И у меня есть класс SaveManager:

package com.package.game; 

import android.app.Activity; 
import android.content.Context; 
import android.content.SharedPreferences; 

public class SaveManager extends Activity { 

private Player player = GameScreen.getPlayer(); 

public void save() { 
    SharedPreferences sp = getSharedPreferences("gameSave", 
      Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = sp.edit(); 

    editor.putInt("X", player.getX()); 
    editor.putInt("Y", player.getY()); 
    editor.putInt("level", player.getLevel()); 
    editor.putFloat("xp", player.getXp()); 
} 
} 

И когда я сохраняю в GameScreen мое приложение вылетает, и я получаю эту LogCat:

02-20 01:39:31.979: E/AndroidRuntime(1368): FATAL EXCEPTION: Thread-119 
02-20 01:39:31.979: E/AndroidRuntime(1368): java.lang.NullPointerException 
02-20 01:39:31.979: E/AndroidRuntime(1368): at com.package.game.GameScreen.updateLevelUp(GameScreen.java:364) 

Строка 364 - это линия savemanager.save();. Я понятия не имею, почему это сбой моего приложения.

+2

* "не работает для меня" * пожалуйста, быть более конкретным. В вашем коде используется контекст «null», но вы упомянули, что это всего лишь * один из ваших проб. –

+0

Это внутри деятельности? – dymmeh

+0

@ A - C, getSharedPreferences() не распознается как метод самостоятельно. Почти в каждом примере я видел, что этот метод сам по себе, а в некоторых примерах это context.getSharedPreferences(), и ни один из них не работает для меня. Как использовать контекст вместо этого? – user2005938

ответ

6

getSharedPreferences() - Context метод. Если save() находится в классе, который расширяет Context, например Activity, вам не нужно делать context.getSharedPreferences(), поэтому вы можете сделать это, поскольку вы ставите его «методом самостоятельно».

Однако, если сохранить не в классе, который простирается Context, для того, чтобы быть в состоянии назвать getSharedPreferences(), он должен иметь Context переменной прошло. Это означает, что то, что вы делали, просто создавая переменную context, недостаточно (и этот код не должен компилироваться, возникла бы ошибка, связанная с тем, что переменная context не была инициализирована). А так как Context s не создаются с использованием конструктора, ваш метод попадает в тупик.

Однако вы близко. Для пояснения вы можете сделать статический метод, который принимает в Context и делает сохранение. static так как этот метод действительно не нужен экземпляр объекта, он может быть самодостаточным:

public static void save(Context context) { 

    if (context == null) 
     throw new RuntimeException ("Context is null, what are you doing?"); 

    SharedPreferences sp = context.getSharedPreferences("gameSave", 
      Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = sp.edit(); 

    editor.putInt("X", player.getX()); 
    editor.putInt("Y", player.getY()); 
    editor.putInt("level", player.getLevel()); 
    editor.putFloat("xp", player.getXp()); 
    editor.commit(); 
} 

Теперь, если этот метод был частью класса, например, с именем StaticUtils, вы можете позвонить сохранить:

  • Через Activity: StaticUtils.save(YourActivityClass.this); или StaticUtils.save(this); в зависимости от области действия (например, если внутри анонимной внутренней функции вы используете YourActivityClass.this).
  • Fragment: StaticUtils.save(getActivity());
  • BroadcastReceiver: StaticUtils.save(context);
  • View (например View передается, когда onClick() называется: StaticUtils.save(v.getContext());

Просто имейте в виду, что earilest вы можете сделать сохранение в Мероприятии onCreate() ничего не произойдет, и Исключение должно четко указывать на это.

Простой е демо. Нет ничего расширения, нет фантазии изготовление Context:

MainActivity.java:

public class MainActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    StaticUtils.save(this); 

    SharedPreferences prefs = getSharedPreferences ("gameSave", Context.MODE_PRIVATE); 
    System.out.println ("X is " + prefs.getInt ("X",-1)); 
    } 
} 

StaticUtils.java

public class StaticUtils { 
    public static void save(Context context) { 

     if (context == null) 
      throw new RuntimeException ("Context is null, what are you doing?"); 

     SharedPreferences sp = context.getSharedPreferences("gameSave", 
       Context.MODE_PRIVATE); 
     SharedPreferences.Editor editor = sp.edit(); 

     editor.putInt("X", 11); 
     editor.putInt("Y", 24); 
     editor.putInt("level", 3); 
     editor.putFloat("xp", 100); 
     editor.commit(); 
    } 
} 
+0

Спасибо, и как я могу назвать этот метод другим методом? Будет что-то вроде контекста контекста; сохранить (контекст); работать? – user2005938

+0

Абсолютно нет, как я сказал в своем ответе: * Это означает, что то, что вы делали, просто создавая переменную контекста, недостаточно *. Вы должны понимать, что просто объявляете переменную *, а не * внезапно заставляете ее что-то содержать. Вам нужен контекст [* valid *] (http://stackoverflow.com/questions/3572463/what-is-context-in-android). Все способы вызова метода в моем ответе должны теоретически предоставлять действительные контексты. –

+0

Если я использую метод, который у вас выше, ни один из способов вызова save (контекст контекста) не работает для меня. Я называю это из одного класса. Если я создаю еще один класс с именем SaveManager, который расширяет контекст и вызывает его из другого класса, я получаю Не могу сделать статическую ссылку на нестатический метод save() из типа SaveManager, а изменение модификатора save() на static делает целое способ не работа. Спасибо за всю вашу помощь до сих пор, и жаль неприятностей. – user2005938

Смежные вопросы