SharedPreferences Layout laden schmeißt NullPointerException

  • Antworten:9
Kristof B.
  • Forum-Beiträge: 7

10.05.2013, 11:35:19 via Website

Hallo Leute,

habe gerade mit meiner ersten App angefangen und versuche jetzt das aktuelle layout über SharedPreferences zu speichern. Klappt auch wunderbar, nur beim Laden hakt es. Wenn ich meine zweite Activity aufgerufen habe, dann die App beende und dann neustarte, schmiert sie ab mit einer NullPointerException. Ich kann leider weder mit dem Debugger von Eclipse noch mit dem Errorlog umgehen. Von daher bitte ich hier um Hilfe.

Quelltext:
public class Soundboard extends Activity implements OnClickListener{


boolean newView = false; //Wird die andere Seite als Startseite gesetzt
String layout; //Welches ist das aktuelle Layout



@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_soundboard);

loadPreferences(); //Lädt Benutzereinstellungen


//Lädt die Benutzereinstellungen
private void loadPreferences() {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
layout = sp.getString("LAYOUT", "1");
newView = sp.getBoolean("SECONDVIEW", false);
if (layout.equals("2") & (newView == true)) {

setContentView(R.layout.activity_soundboard_sorted);

}
else if (layout.equals("1") & (newView == false)){

setContentView(R.layout.activity_soundboard);

}
}


private void savePreferences(String key, String value) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
Editor edit = sp.edit();
edit.putString(key, value);
edit.commit();
}


private void savePreferences(String key, Boolean value) {
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
Editor edit = sp.edit();
edit.putBoolean(key, value);
edit.commit();
}

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case R.id.action_settings:
if (newView){
Intent intent3 = new Intent(this, Soundboard.class);
startActivity(intent3);
//setContentView(R.layout.activity_soundboard);
savePreferences("LAYOUT", "1");
savePreferences("SECONDVIEW", false);
finish();
}
else {
Intent intent4 = new Intent(this, SoundboardSorted.class);
startActivity(intent4);
//setContentView(R.layout.activity_soundboard_sorted);
savePreferences("LAYOUT", "2");
savePreferences("SECONDVIEW", true);
finish();
}

newView = !newView;

return true;

Errornachricht:
05-10 08:04:06.582: D/dalvikvm(350): GC_EXTERNAL_ALLOC freed 53K, 53% free 2564K/5379K, external 2002K/2137K, paused 96ms
05-10 08:04:06.932: D/AndroidRuntime(350): Shutting down VM
05-10 08:04:06.932: W/dalvikvm(350): threadid=1: thread exiting with uncaught exception (group=0x40015560)
05-10 08:04:06.962: E/AndroidRuntime(350): FATAL EXCEPTION: main
05-10 08:04:06.962: E/AndroidRuntime(350): java.lang.RuntimeException: Unable to start activity ComponentInfo{appname.app/appname.app.Soundboard}: java.lang.NullPointerException
05-10 08:04:06.962: E/AndroidRuntime(350): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
05-10 08:04:06.962: E/AndroidRuntime(350): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
05-10 08:04:06.962: E/AndroidRuntime(350): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
05-10 08:04:06.962: E/AndroidRuntime(350): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
05-10 08:04:06.962: E/AndroidRuntime(350): at android.os.Handler.dispatchMessage(Handler.java:99)
05-10 08:04:06.962: E/AndroidRuntime(350): at android.os.Looper.loop(Looper.java:123)
05-10 08:04:06.962: E/AndroidRuntime(350): at android.app.ActivityThread.main(ActivityThread.java:3683)
05-10 08:04:06.962: E/AndroidRuntime(350): at java.lang.reflect.Method.invokeNative(Native Method)
05-10 08:04:06.962: E/AndroidRuntime(350): at java.lang.reflect.Method.invoke(Method.java:507)
05-10 08:04:06.962: E/AndroidRuntime(350): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-10 08:04:06.962: E/AndroidRuntime(350): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-10 08:04:06.962: E/AndroidRuntime(350): at dalvik.system.NativeStart.main(Native Method)
05-10 08:04:06.962: E/AndroidRuntime(350): Caused by: java.lang.NullPointerException
05-10 08:04:06.962: E/AndroidRuntime(350): at appname.app.Soundboard.onCreate(Soundboard.java:148)
05-10 08:04:06.962: E/AndroidRuntime(350): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-10 08:04:06.962: E/AndroidRuntime(350): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
05-10 08:04:06.962: E/AndroidRuntime(350): ... 11 more

Wäre cool, wenn ihr mir ein paar Tips geben könntet und vielleicht den Fehler identifizieren.

— geändert am 10.05.2013, 11:43:05

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

10.05.2013, 11:47:45 via Website

Hier steht sowohl die Klasse, als auch die Zeile in der der Fehler auftritt.

105-10 08:04:06.962: E/AndroidRuntime(350): Caused by: java.lang.NullPointerException
205-10 08:04:06.962: E/AndroidRuntime(350): at appname.app.Soundboard.onCreate(Soundboard.java:148)

Ich tippe mal du versuchst mit findViewById() einen View zu laden, der in dem Layout nicht existiert.
Generell würde ich sagen, in einer Activity zur Laufzeit zwischen unterschiedlichen Layouts umzuschalten ist eine sehr schöne Quelle für solche Fehler. Würde ich an deiner Stelle vermeiden, wenn Du mit Java/Android noch unsicher bist.

— geändert am 10.05.2013, 11:48:50

Antworten
Kristof B.
  • Forum-Beiträge: 7

10.05.2013, 11:57:05 via Website

Hm...danke. Jetzt bin ich verwirrt, da in Zeile 148 lediglich ein Button (von 32) per findViewById initialisiert wird. Während der Laufzeit ändern würde ich wirklich gerne hinbekommen. So als kleines Feature, dass der Nutzer seine gewollte Startseite festlegen kann. Theoretisch dürfte er auch gar nicht bis da kommen, da vorher ja loadPreferences() ausgeführt wird, wodurch er ja auf die andere Activity springen sollte. Oder irre ich mich da?

Edit: Es stürzt übrigens nur ab, wenn ich die App wirklich richtig beende. Also unter Applications-->Force Close.

— geändert am 10.05.2013, 12:05:38

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

10.05.2013, 12:25:31 via Website

Die Fehlermeldung lügt aber nicht.
Wenn in der Zeile der Fehler fliegt, ist der View, den du da holst nicht im Layout vorhanden.

Und unterschiedliche Layouts machst Du doch bereits durch das if/else in der loadPreferences() Methode.
Ich denke mal Du hast dort einfach einen Fehler bei den IDs drin.

Antworten
Kristof B.
  • Forum-Beiträge: 7

10.05.2013, 13:08:09 via Website

Ok sehr interessant das ganze hier. Ich muss mich erstmal korrigieren: Es war die Zeile, in der onClickListener steht. Habe jetzt diese Zeile und die folgenden (bis zum Ende der Listener) deaktiviert. Jetzt habe ich noch davor bis Zeile 147 ca 25 Buttons und dann die deaktivierten. Und es startet wunderbar!!??
Ich verstehe jetzt nicht, was der an den Listenern auszusetzen hat.

Antworten
Kristof B.
  • Forum-Beiträge: 7

10.05.2013, 13:33:07 via Website

Ja das stimmt ja. Aber in der Zeile, für die der Fehler geschmissen wird, steht der OnClickListener. Die Id für diese Buttons wird bereits davor geholt und zwar offenbar erfolgreich. Nachdem ich die Listener deaktiviert habe gehts ja jetzt.
Aber mir ist gerade aufgefallen, dass der Fehler ab der Zeile auftritt, wo in der ersten Activity Buttons sind, in der zweiten jedoch nicht. Also, was ich meine: in der ersten Activity gehen die Buttons von 1 bis 32 und in der zweiten Activity nur von 1 bis 26. Und der Fehler tritt bei Button27 auf. Das erklärt zumindest, warum es geht, wenn die Listener deaktiviert sind. Also versucht die Activity offenbar, sich die ID eines Buttons der zweiten Activity zu holen. Verstehe ich nicht ganz.

Antworten
Kristof B.
  • Forum-Beiträge: 7

10.05.2013, 13:45:07 via Website

Rafael K.


1v.beliebigeMethode();

Ich schätze hier, da er hier erst auf die "gefundene" Id zugreift. Womit ich die Hälfte meiner Posts revidieren müsste.^^

Nichtsdestotrotz würde es mich interessieren, warum er keine Id findet. Der einzige Fall, wo er keine Id finden kann, ist, wenn er von Seite1 (hier tritt der Fehler auf) mit dem findViewById eine Id eines Buttons von Seite2 (die möchte ich ja ausm Speicher quasi starten) laden möchte, wo es die natürlich nicht gibt.

— geändert am 10.05.2013, 13:47:37

Antworten
impjor
  • Forum-Beiträge: 1.793

11.05.2013, 10:24:42 via App

In deinem Code hast du doch gar keine Listener stehen, oder? Dann kann man dir natürlich nicht helfen.
Ach ja, und benutze bitte immer [code] für Quelltext.

Gruß

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten