2016-08-03 6 views
0

Я использую активность навигационного элемента Android Studio, и я хочу, чтобы закладок появлялся всякий раз, когда я нажимаю одну из кнопок в ящике, но когда я нажимаю на нее, приложение падает , Вот упрощенная версия кода запуска при нажатии на одну из кнопок навигации:Мое приложение падает, когда я пытаюсь показать закусочную

@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(); 
    } 

Я думаю, что проблема в том, что я должен заменить findViewById(R.id.nav_playstore) с чем-то еще, но я не уверен, что я бы там вместо этого. Если вам нужна дополнительная информация, я могу дать вам немного. Спасибо :)

Edit: Вот 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

вывесить StackTrace исключительной ситуации – Blackbelt

+0

Вы должны пройти вид (а не меню) ... Итак, замените findViewById (R.id.nav_playstore) любым другим что у вас есть (например: findViewById (R.id.my_text_view) – W0rmH0le

+0

Выполнять 'findViewById (...)' stuff внутри 'onCreate()'. Используйте свои представления там, где вы хотите. Кроме того, первый параметр 'Snackbar. make (...) 'должен быть контейнером для сообщения' Snackbar', а не что-либо еще. –

ответ

1

Kelvin.

Чтение на DOCS, вы можете увидеть, что первые параметры как:

Вид: Вид, чтобы найти родителей из.

Итак, вы должны передать любое представление, которое у вас есть. Таким образом, снэк-бар может отслеживать и находить родительский вид.

У вас, вероятно, есть другое представление в вашей деятельности.

Вы передаете

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

Однако R.id.nav_playstore является Идентификатор пункта меню (а не VIEW). Таким образом, findViewById(R.id.nav_playstore) возвращает NULL.

Измените ID от findViewById(R.id.nav_playstore) на идентификатор любого другого View, который у вас есть на текущей деятельности. Это может быть TextView, EditText и т.д ...

+0

Я изменил его на 'R.id.nav_view' (сам вид меню навигации), и теперь он отлично работает. Но также, не возражаете ли вы слегка объяснить, что такое первый параметр, и почему это имеет значение вообще? –

1

Закусочная необходимо либо вид Cordinator компоновщика или вид FloatingAction Button, чтобы работать должным образом и ответить точно. И вы передали идентификатор Nav в корпусе Snackbar.

Что делать

1- макет Wrap внутри координатора макета назначить ему ID и использовать этот вид в закусочной.

2- Pass findViewById из FAB (если существует), то он будет показывать закусочную соответствующим образом.

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

Надеюсь, это поможет.