2016-09-13 2 views
0

Android Studio를 시작하면서 현재 메모를 작성하고 저장하는 간단한 앱을 만들려고합니다. '할 일 목록'기능이 있습니다. Json/Gson을 사용하여 SharedPreferences에 저장하려고합니다. 몇 가지 온라인 자습서를 따라 갔지만 제대로 작동하지 않는 것처럼 보입니다. 여기에 비슷한 질문이 도움이되지 않았다. 이것은 지금까지 내 코드입니다 :SharedPreferences에서 NullPointerException이 발생했습니다.

MainActivity.java :

public class MainActivity extends AppCompatActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     NoteHandler noteHandler = new NoteHandler(); 
     noteHandler.newNote("test", 1); 
    } 

} 

Note.java :

public class Note { 

    public enum State { TODO, DONE }; 

    private String content; 
    private State state; 
    private Date date; 
    private int id; 
    private Note parent; 

    public Note(String content, State state, Date date, Note parent, int id) { 
     this.content = content; 
     this.state = state; 
     this.date = date; 
     this.parent = parent; 
     this.id = id; 
    } 

    /* Getters and setters */ 

} 

NoteHandler.java :

public class NoteHandler { 

    NotePrefs notePrefs = new NotePrefs(ContextGetter.getAppContext()); 

    void newNote(String content, int id) { 
     newNote(content, null, id); 
    } 

    void newNote(String content, Note parent, int id) { 
     Note newNote = new Note(content, Note.State.TODO, new Date(), parent, id); 
     notePrefs.saveNote(newNote); 
    } 

    Note getNote(int id) { 
     return notePrefs.loadNote(id); 
    } 
} 

NotePrefs.java :

public class NotePrefs { 
    private final String PREFS_NAME = "notes.NotePrefs"; 
    private static SharedPreferences settings; 
    private static SharedPreferences.Editor editor; 
    private static Gson gson = new Gson(); 

    public NotePrefs(Context ctx) { 
     if(settings == null) { 
      settings = ctx.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); 
     } 

     editor = settings.edit(); 
    } 

    public static void saveNote(Note note) { 
     editor.putString("" + note.getId(), gson.toJson(note)); 
     editor.apply(); 
    } 

    public static Note loadNote(int id) { 
     String noteJson = settings.getString("" + id, ""); 
     return gson.fromJson(noteJson, Note.class); 
    } 

    public static List<Note> loadAllNotes() { 
     return null; 
    } 
} 

ContextGetter.java :

public class ContextGetter extends Application { 

    private static Context context; 

    public void onCreate(){ 
     super.onCreate(); 
     context = getApplicationContext(); 
    } 

    public static Context getAppContext() { 
     return context; 
    } 
} 

예외 :

java.lang.RuntimeException가 : 활동 ComponentInfo를 시작할 수 없습니다 {노트/notes.MainActivity} : java.lang.NullPointerException이 : 시도는 가상 호출 메서드 'android.content.SharedPreferences android.content.Context.getSharedPreferences (java.lang.String, int)'null 객체 참조에

여전히 컨텍스트 물건 주위에 내 머리를 포장하는 것 같습니다. 어떤 도움을 주셔서 감사합니다!

또한 loadAllNotes()를 구현하는 좋은 방법은 무엇입니까? 당신은 name=".ContextGetter"를 추가해야

건배

+0

흠,이 'ContextGetter'가 제대로 작동하지 않는 것 같습니다. 어째서 활동의 인스턴스를'NoteHandler'에 'context'로 전달한 다음'NotePrefs'에 전달할 수 없습니까? – Vucko

+0

다른 의견으로 이미 작동했습니다. 정확히 무엇을 제안 했습니까? 코드로 작성할 수 있습니까? 나는 아직 활동과 컨텍스트 (아직)에 대해 전혀 모른다 ... – Shlx

+0

stacktrace를 게시하십시오. 또한 어떤 라인이 NPE를 유발합니까? –

답변

1

<application> 태그에 명시합니다.

+0

와우, 그 트릭을 실제로했습니다! 나는 그것이 내 바보 같은 실수가 아니었기 때문에 기쁘다. 고맙습니다! 그 라인이 정확히 무엇인지, 왜 모든 것이 작동하는지 설명해 주시겠습니까? – Shlx

+0

환영합니다. 이 줄이 없으면 응용 프로그램을 확장하는 클래스를 만들 수 없습니다. 대답 –

+0

을 받으십시오. 좋습니다. 수락, 고마워요. – Shlx

관련 문제