2016-08-03 6 views
0

Ich verwende die Navigationsschubladenaktivität von Android Studio und möchte eine Snackbar immer dann anzeigen, wenn ich auf eine der Schaltflächen in der Schublade klicke, aber wenn ich darauf klicke, stürzt die App ab . Hier ist eine vereinfachte Version des Codes ausgeführt werden, wenn ich auf einer der Navigationstasten klicken:Meine App stürzt ab, wenn ich versuche, eine Snackbar zu zeigen

@SuppressWarnings("StatementWithEmptyBody") 
@Override 
public boolean onNavigationItemSelected(MenuItem item) { 
    DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    int id = item.getItemId(); 
    if (id == R.id.nav_playstore) { 
     Snackbar.make(findViewById(R.id.nav_playstore), "This app is not available on the Play Store yet", Snackbar.LENGTH_LONG).show(); 
    } 

Ich denke, das Problem ist, dass ich findViewById(R.id.nav_playstore) mit etwas ersetzen soll sonst, aber ich bin mir nicht sicher, was ich Stellen Sie stattdessen dort. Wenn Sie mehr Informationen benötigen, kann ich Ihnen etwas geben. Thanks :)

Edit: Hier ist der Stacktrace:

08-03 10:03:45.658 20870-20870/ca.davesautoservice.davesautoservice E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: ca.davesautoservice.davesautoservice, PID: 20870 
    java.lang.NullPointerException 
     at android.support.design.widget.Snackbar.<init>(Snackbar.java:183) 
     at android.support.design.widget.Snackbar.make(Snackbar.java:215) 
     at ca.davesautoservice.davesautoservice.MainActivity.onNavigationItemSelected(MainActivity.java:106) 
     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:4463) 
     at android.view.View$PerformClick.run(View.java:18770) 
     at android.os.Handler.handleCallback(Handler.java:808) 
     at android.os.Handler.dispatchMessage(Handler.java:103) 
     at android.os.Looper.loop(Looper.java:193) 
     at android.app.ActivityThread.main(ActivityThread.java:5333) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:828) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:644) 
     at dalvik.system.NativeStart.main(Native Method) 
+1

post die Stacktrace der Exception – Blackbelt

+0

Sie einen Blick passieren sollte (und kein Menü) ... So ersetzen findViewById (R.id.nav_playstore) von einem anderen sehen Sie, dass Sie haben (wie: findViewById (R.id.my_text_view) – W0rmH0le

+0

Führen Sie 'findViewById (...)' Zeug in 'onCreate()'. Verwenden Sie Ihre Ansichten, wo immer Sie dann wollen. Außerdem der erste Parameter von 'Snackbar. make (...) 'sollte die Containeransicht für die' Snackbar' Nachricht sein, sonst nichts. –

Antwort

1

Kelvin.

Lesen der DOCS, können Sie feststellen, dass erste Parameter zu sehen ist:

Ausblick: Die Aussicht von einem Elternteil zu finden.

So sollten Sie jede Ansicht übergeben, die Sie haben. Auf diese Weise kann die Snackbar die Elternansicht verfolgen und finden.

Sie haben wahrscheinlich eine andere Sichtweise in Ihrer Aktivität.

Sie passieren

Snackbar.make(findViewById(R.id.nav_playstore), "This app is not available on the Play Store yet", Snackbar.LENGTH_LONG).show(); 

Allerdings ist R.id.nav_playstore die ID a eines Menüpunktes (und kein VIEW). Auf diese Weise gibt findViewById(R.id.nav_playstore)NULL zurück.

Ändern Sie die ID von findViewById(R.id.nav_playstore) in eine ID eines anderen View, den Sie in der aktuellen Aktivität haben. Es kann ein TextView sein, EditText etc ...

+0

Ich änderte es in 'R.id.nav_view' (das Navigationsmenü selbst) und es funktioniert jetzt gut. Aber macht es Ihnen etwas aus, leicht zu erklären, was der erste Parameter ist und warum er überhaupt von Bedeutung ist? –

1

Snack-Bar muss entweder nach Ansicht des Cordinator Layout oder nach Ansicht des FloatingAction Knopf genau richtig und reagieren zu bedienen. Und Sie passierten Nav's ID in Snackbars Körper.

Was

1- Wrap Layout innerhalb Coordinator Layout-Zuweisung einer ID und verwenden Sie diese Ansicht in Snackbar zu tun.

2- Führen Sie findViewById von FAB (wenn vorhanden), dann wird snackbar entsprechend angezeigt.

Snackbar.make(findViewById(R.id.fab), "message", Snackbar.LENGTH_SHORT).show(); 

Ich hoffe, es hilft.