2016-04-14 57 views
-2

我想在我的應用中導入導航抽屜。我的代碼片段,但在開始我的應用程序崩潰,並且我收到以下錯誤:需要關於導航抽屜出錯的幫助

Error: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.design.widget.NavigationView.setNavigationItemSelectedListener(android.support.design.widget.NavigationView$OnNavigationItemSelectedListener)' on a null object reference

代碼:

import android.content.res.Configuration; 
import android.os.Bundle; 
import android.support.design.widget.NavigationView; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.view.GravityCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.MenuItem; 
import android.support.v4.app.Fragment; 
import android.support.v7.app.ActionBarDrawerToggle; 

public class NavigationDrawer extends AppCompatActivity { 
    private DrawerLayout NavDrawer; 
    private Toolbar toolbar; 


    private ActionBarDrawerToggle setupDrawerToggle() { 
     return new ActionBarDrawerToggle(this, NavDrawer, toolbar, R.string.drawer_open, R.string.drawer_close); 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_navigation_drawer); 


     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 


     NavDrawer = (DrawerLayout) findViewById(R.id.drawer_layout); 

     NavigationView nvDrawer = (NavigationView) findViewById(R.id.nvView); 

     setupDrawerContent(nvDrawer); 

     ActionBarDrawerToggle toggle = setupDrawerToggle(); 

     NavDrawer.addDrawerListener(toggle); 
    } 

    private void setupDrawerContent(NavigationView navigationView) { 
     navigationView.setNavigationItemSelectedListener(
      new NavigationView.OnNavigationItemSelectedListener() { 
       @Override 
       public boolean onNavigationItemSelected(MenuItem menuItem) { 
        selectDrawerItem(menuItem); 
        return true; 
       } 
      }); 
    } 
} 

我看不到我的代碼中的錯誤...

//編輯爲更好的信息...

好吧,我有做,但現在來了一個新的錯誤...

java.lang.N ullPointerException:嘗試在空對象引用

調用虛擬方法android.view.Window $回調android.view.Window.getCallback()',但我不知道代碼是誰...

這裏在XML

<?xml version="1.0" encoding="utf-8"?> 
 
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
 
    xmlns:tools="http://schemas.android.com/tools" 
 
    android:id="@+id/drawer_layout" 
 
    android:layout_width="match_parent" 
 
    android:layout_height="match_parent" 
 
    android:fitsSystemWindows="true" 
 
    tools:openDrawer="start"> 
 

 
    <include 
 
     layout="@layout/app_bar_navigation_drawer" 
 
     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:headerLayout="@layout/nav_header_navigation_drawer" 
 
     app:menu="@menu/activity_navigation_drawer_drawer" /> 
 

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

//編輯好吧,我必須讓它...和錯誤

Error: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.design.widget.NavigationView.setNavigationItemSelectedListener(android.support.design.widget.NavigationView$OnNavigationItemSelectedListener)' on a null object reference

已經來了......

public class NavigationDrawer extends AppCompatActivity { 
 
    private DrawerLayout NavDrawer; 
 
    private Toolbar toolbar; 
 
    private ActionBarDrawerToggle toggle; 
 
    
 
    @Override 
 
    protected void onCreate(Bundle savedInstanceState) { 
 
     super.onCreate(savedInstanceState); 
 
     setContentView(R.layout.activity_navigation_drawer); 
 

 
     toggle = new ActionBarDrawerToggle(this, NavDrawer, 
 
       toolbar, R.string.drawer_open, R.string.drawer_close) { 
 

 
      public void onDrawerClosed(View view) { 
 
       super.onDrawerClosed(view); 
 
       invalidateOptionsMenu(); 
 
      } 
 

 
      public void onDrawerOpened(View drawerView) { 
 
       super.onDrawerOpened(drawerView); 
 
       invalidateOptionsMenu(); 
 
      } 
 
     }; 
 

 
     toolbar = (Toolbar) findViewById(R.id.toolbar); 
 
     setSupportActionBar(toolbar); 
 

 
     NavDrawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
 

 
     NavigationView nvDrawer = (NavigationView) findViewById(R.id.nvView); 
 

 
     NavDrawer.setDrawerListener(toggle); 
 
    } 
 

 
    @Override 
 
    public boolean onOptionsItemSelected(MenuItem item) { 
 
    
 

 
     super.onOptionsItemSelected(item); 
 

 
     switch (item.getItemId()) { 
 
      case android.R.id.home: 
 
       NavDrawer.openDrawer(GravityCompat.START); 
 
       return true; 
 
     } 
 

 
     return super.onOptionsItemSelected(item); 
 
    } 
 

 
    @Override 
 
    protected void onPostCreate(Bundle savedInstanceState) { 
 
     super.onPostCreate(savedInstanceState); 
 
     toggle.syncState(); 
 
    } 
 

 
    @Override 
 
    public void onConfigurationChanged(Configuration newConfig) { 
 
     super.onConfigurationChanged(newConfig); 
 
     toggle.onConfigurationChanged(newConfig); 
 
    } 
 

 
    private void selectDrawerItem(MenuItem menuItem) { 
 
    
 
     Fragment fragment = null; 
 
     Class fragmentClass; 
 
     switch(menuItem.getItemId()) { 
 
      case R.id.nav_home: 
 
       fragmentClass = Home.class; 
 
       break; 
 
      case R.id.nav_artikel: 
 
       fragmentClass = Artikel.class; 
 
       break; 
 
      case R.id.nav_facebook: 
 
       fragmentClass = Facebook.class; 
 
       break; 
 
      case R.id.nav_instagram: 
 
       fragmentClass = Instagram.class; 
 
       break; 
 
      case R.id.nav_twitter: 
 
       fragmentClass = Twitter.class; 
 
       break; 
 
      case R.id.nav_manage: 
 
       fragmentClass = Settings.class; 
 
       break; 
 
      case R.id.nav_share: 
 
       fragmentClass = Share.class; 
 
       break; 
 
      case R.id.nav_send: 
 
       fragmentClass = Send.class; 
 
       break; 
 
      default: 
 
       fragmentClass = Home.class; 
 
     } 
 

 
     try { 
 
      fragment = (Fragment) fragmentClass.newInstance(); 
 
     } catch (Exception e) { 
 
      e.printStackTrace(); 
 
     } 
 

 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
 
     fragmentManager.beginTransaction().replace(R.id.flContent, fragment).commit(); 
 
     menuItem.setChecked(true); 
 
     setTitle(menuItem.getTitle()); 
 
     NavDrawer.closeDrawers(); 
 
    } 
 

 
}

這是Completted導航的java ....

+1

你能發佈相關的XML嗎? E.g'activity_navigation_drawer' ... –

+0

在答案中... –

回答

0

它看起來像你的問題是,你是不是從你的setupDrawerContent()返回任何東西。所以當你分配ActionBarDrawerToggle toggle = setupDrawerToggle;toggle將是一個空值。當您嘗試addDrawerListener時,您將獲得NullPointerException,嘗試設置爲空的抽屜偵聽器。

以下是Google's Creating a Navigation Drawer的示例,用於正確設置抽屜監聽器。

ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
      R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) { 

     /** Called when a drawer has settled in a completely closed state. */ 
     public void onDrawerClosed(View view) { 
      super.onDrawerClosed(view); 
      getActionBar().setTitle(mTitle); 
      invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
     } 

     /** Called when a drawer has settled in a completely open state. */ 
     public void onDrawerOpened(View drawerView) { 
      super.onDrawerOpened(drawerView); 
      getActionBar().setTitle(mDrawerTitle); 
      invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
     } 
    }; 
+0

你在Exception消息中看到addDrawerListener()方法嗎? –

+0

我已將它添加到onCreate .. NavDrawer.addDrawerListener(toogle); –