2016-08-03 1 views
0

Android 서랍의 탐색 창 활동을 사용하고 있으며 서랍에있는 버튼 중 하나를 클릭 할 때마다 스낵바를 표시하고 싶지만 클릭하면 앱이 다운됩니다 . 내가 탐색 버튼 중 하나를 클릭하면 다음 코드 실행의 단순화 된 버전입니다 :스낵바 표시 시도시 내 앱이 작동을 멈 춥니 다

@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)를 교체해야한다고 생각하지만 나는 내가 무엇을하고자 확실하지 않다 대신 거기에 두십시오. 더 많은 정보가 필요하면, 내가 줄 수있어. 감사합니다 :)

편집 : 다음은 스택 트레이스의 :

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

다른 어떤에서 당신은 대체, 뷰 (아닌 메뉴)를 통과 ... 그래서해야 – Blackbelt

+0

예외의 스택 트레이스 findViewById를 (R.id.nav_playstore를) 게시 (예 : findViewById (R.id.my_text_view)) – W0rmH0le

+0

'findViewById (...)'를'onCreate()'안에서 수행하십시오. 당신이 원할 때마다 당신의 뷰를 사용하고 게다가'Snackbar. make (...)'는 Snackbar 메시지에 대한 컨테이너 뷰 여야합니다. –

답변

1

켈빈.

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는 ID 메뉴 항목의 (아닌 VIEW)입니다. 이렇게하면 findViewById(R.id.nav_playstore)NULL을 반환합니다.

ID를 findViewById(R.id.nav_playstore)에서 현재 활동에있는 다른 View의 ID로 변경하십시오. 그것은 TextView 될 수 EditText 등 ...

+0

'R.id.nav_view' (네비게이션 메뉴보기 자체)로 변경 했으므로 이제는 잘 동작합니다. 그러나 첫 번째 매개 변수가 무엇인지, 그리고 그것이 전혀 중요한 이유를 간단히 설명하는 것이 마음에 드십니까? –

1

스낵 바는 Cordinator 레이아웃의보기 또는 제대로 작동하고 정확하게 대응할 수 FloatingAction 버튼의보기 중 하나를 필요로한다. 너는 Snackbar의 시체에서 nav의 이드를 통과했다. 코디네이터 레이아웃 내부

1 랩 레이아웃을해야 할 일

그것을 ID를 할당 및 플로팅 작업에서 해당 뷰를 사용합니다.

2 FAB의 findViewById를 전달하면 (존재하는 경우) 스낵바가 적절하게 표시됩니다.

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

희망이 있습니다.

관련 문제