[Blutiger Anfänger] App stürzt beim Activity-Wechsel ab

  • Antworten:10
  • Bentwortet
Jan
  • Forum-Beiträge: 9

26.02.2016, 21:26:58 via Website

Hallo zusammen,

ich bin blutiger Anfänger in der Programmierung von Apps. Als erstes, einfach Ziel habe ich mir gesetzt, eine App zu machen, in der man über ein Slide-Menu zwischen verschiedenen Activitys wechseln kann.
(Das Menü habe ich über das Template von Android Studio hinzufügen lassen)

Nun bin ich soweit, dass ich von der MainActivity in eine andere Activity wechseln kann. Das funktioniert so weit. Nun kann ich aber nicht mehr von der anderen Activity zurück in die MainActivity wechseln. Die App stürzt dann ab. Selbst wenn ich nochmal auf die aktuelle Activity klicke. Ich komme leider echt nicht weiter.

MainActivity:

public class MainActivity extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
}

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.
    int id = item.getItemId();

    if (id == R.id.nav_prozent) {

        Intent intent = new Intent(this, Prozent.class);
        startActivity(intent);

    } else if (id == R.id.nav_share) {

    } else if (id == R.id.nav_send) {

    } else if (id == R.id.nav_home) {

        Intent intenthome = new Intent(this, MainActivity.class);
        startActivity(intenthome);

    }

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);
    return true;
}

}

Zweite Activity:

public class Prozent extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.prozent);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout2);
    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
    drawer.setDrawerListener(toggle);
    toggle.syncState();

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

}

@Override
public void onBackPressed() {
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    if (drawer.isDrawerOpen(GravityCompat.START)) {
        drawer.closeDrawer(GravityCompat.START);
    } else {
        super.onBackPressed();
    }
}

@Override
public boolean onNavigationItemSelected(MenuItem item) {

    int id = item.getItemId();

    if (id == R.id.nav_prozent) {

        Intent intent = new Intent(this, Prozent.class);
        startActivity(intent);

    } else if (id == R.id.nav_share) {

    } else if (id == R.id.nav_send) {

    } else if (id == R.id.nav_home) {

        Intent intenthome = new Intent(this, MainActivity.class);
        startActivity(intenthome);

}



    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
    drawer.closeDrawer(GravityCompat.START);

    return true;
}

}

Fehlermeldung:

02-26 20:25:40.543 2631-2650/com.example.jan.rechner E/Surface: getSlotFromBufferLocked: unknown buffer: 0xab7d3ff0
02-26 20:25:42.936 2631-2631/com.example.jan.rechner D/AndroidRuntime: Shutting down VM
02-26 20:25:42.936 2631-2631/com.example.jan.rechner E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.jan.rechner, PID: 2631
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v4.widget.DrawerLayout.closeDrawer(int)' on a null object reference
at com.example.jan.rechner.Prozent.onNavigationItemSelected(Prozent.java:72)
at android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:151)
at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:811)
at android.support.v7.view.menu.SubMenuBuilder.dispatchMenuItemSelected(SubMenuBuilder.java:84)
at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:958)
at android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:318)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

Bitte seid nicht all zu streng. Bin wie gesagt blutiger Anfänger. :)

Mit freundlichen Grüßen,
Jan G

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

26.02.2016, 21:39:14 via Website

Hallo Jan,
Herzlich wilkommen hier im Forum ;)



Warum sollten wir streng sein?
Jeder fängt mal an und hatte Probleme, das ist ganz normal.

Zum Problem:

In deiner Zweiten Activity gibt es so wie es scheint keinen NavigationDrawer, da anderes Layout (oder hast du diesen kopiert)?

Um das Problem vorerst aus der Welt zu schaffen musst du die OnBackPressed Methode anders gestalten:

@Override
public void onBackPressed() {

    super.onBackPressed();

}

Ich habe jetzt mal den ganzen NavDrawer Kram da raus geworfen, da der ja den Fehler verursacht.

Genausso geht es in

onNavigationItemSelected

da Entfernst du intern diese beiden Zeilen:

DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);

Soweit zur Praxis, da du ja aber bestimmt auch lernen willst wie man Fehler selber behebt hier mal ein Trick:

  1. Exception lesen:
    Attempt to invoke virtual method 'void android.support.v4.widget.DrawerLayout.closeDrawer(int)' on a null object reference
    at com.example.jan.rechner.Prozent.onNavigationItemSelected(Prozent.java:72)

Stichwort nullReference sagt schon, da soll irgendwas auf ein Ojekt ausfegührt werden, diese Objekt ist aber nicht Instanziiert (einem bestimten Wert zugeordnet)
Desweiteren verrät dir der Log auch noch wo der Fehler autritt:
Prozent.onNavigationItemSelected(Prozent.java:72)
Somit in der Methode onNavigationItemSelected in der Datei Przent.java in Zeile 72

  1. Den Code an der Fehlerstelle näher anschauen:
    Jetzt weisst du wo der fehler autritt und warum.
    Die Fehlerbehebung ist allerdings schwieriger, hier muss man dann prüfen warum ein bestimmter Wert nicht zugewiesen wurde.
    In deinem Fall gehe ich davon aus dass der NavDrawer auf den Layout nicht existiert, er kann also per findViewById nicht gefunden werden.
    Damit erklärt ich dann auch der Fehler

  2. Fehler beheben:

Da gibt es meist mehrere Möglichkeiten:
Betreffene Zeilen auskommentieren/löschen, damit ist das Peoblem weg es tut aber auch uum. nur die Hälfte.
In deinem Fall jetzt hilft es den NavDrawer auf das Layout zu packen, den müsstest du ja einfach vom Layout der MainActivity kopieren können.

LG Pascal //It's not a bug, it's a feature. :) ;)

Ludy

Antworten
Jan
  • Forum-Beiträge: 9

26.02.2016, 21:54:34 via Website

Danke für die schnelle Antwort. :)

Ich habe es leider schon oft erlebt, dass wenn man sich als Anfänger in einem Forum anmeldet, eher schlecht aufgenommen wird, da man teils sehr dumme Fehler macht.

Und nochmals danke, deine Lösung hat geholfen. Meine Denkweise war: "Das ist schon in der MainActivity drin und hat bestimmt mit dem Menü zutun, dann muss das in die andere Acivity auch mit rein". War anscheinend wohl falsch. ^^'

Ich habe mich tatsächlich auch an den Fehlermeldungen probiert und bin auch auf der besagten Zeile 72 angekommen. Bin aber leider nicht auf die Idee gekommen den Teil einfach zu löschen.

Grüße Jan

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

26.02.2016, 21:55:47 via App

Hallo Jan!

Super, wenn deine Frage geklärt ist, setze doch bitte noch deinen Thread auf "Beantwortet"!

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jan
  • Forum-Beiträge: 9

26.02.2016, 22:04:07 via Website

Werde ich gleich sofort machen. :)

Nur noch ein Problem, dass ich gerade ergeben hat. Ich kann gerade meine .xml-Datei, die die zweite Activity darstellt, nicht bearbeiten.

Datei:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="*Link*"
xmlns:app="*Link*"
xmlns:tools="*Link*"
android:id="@+id/drawer_layout2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:openDrawer="start">

<include
    layout="@layout/app_bar_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true"
    app:menu="@menu/activity_main_drawer" />

   </android.support.v4.widget.DrawerLayout>

Ebenfalls ist das Menü die ganze Zeit ausgefahren, sodass ich gar keine TextViews oder ähnliches per Drag-and-Drop setzen kann. Gibt es dafür auch eine Lösung?

Grüße Jan

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

26.02.2016, 22:09:41 via Website

Das Layout sieh in Ordnung aus.
Was meinst du mit "nicht bearbeiten"
Die XML kannst du doch bearbeiten.
Der Designer hat manchmal so seine macken.
Am besten AndroidStudio mal neu starten.

— geändert am 26.02.2016, 22:09:58

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jan
  • Forum-Beiträge: 9

26.02.2016, 22:31:11 via Website

Neustart hat leider nicht geholfen. Mein Problem sieht so aus:

image

Das Menü stört. Ich kann die eigentliche Oberfläche nicht bearbeiten.
Wenn ich nun ein TextView o.ä. auf das Handy ziehe, ändert sich der Mauszeiger zu diesem allbekannten Kreis mit einem Strich durch. (Wusste nicht wie ich das anders beschreiben soll)

— geändert am 26.02.2016, 22:41:36

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

26.02.2016, 22:49:20 via App

Dann mach die NavView weg und später wieder hin. Ist ja nicht viel Aufwand

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jan
  • Forum-Beiträge: 9

26.02.2016, 22:55:10 via Website

Das habe ich vorhin auch schon gemacht. Aber das Problem, dass ich die Oberfläche nicht bearbeiten kann, bleibt bestehen.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

26.02.2016, 22:58:12 via App

Dann mach es oldschool über die XML selbst wenn es etwas aufwändiger ist.
AS greift dir hier ja auch unter die Arme

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Jan
  • Forum-Beiträge: 9

26.02.2016, 23:09:23 via Website

Gut, dann bleibt mir wohl keine andere Wahl.

Dankeschön. :)

/beantwortet

— geändert am 26.02.2016, 23:10:25

Antworten