1

Я застрял в этом исключении NullPointerException. Я искал похожие сообщения и пытался их всех, но никто не работает. Похоже, что я что-то упускаю, но я не могу найти, что это такое. Пожалуйста помоги.Android DrawerLayout с NullPointerException

Вот отладочный вывод:

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: project_name, PID: 4101 
       java.lang.RuntimeException: Unable to start activity ComponentInfo{project_name/project_name.activity.HomeActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.support.design.widget.NavigationView.getHeaderView(int)' on a null object reference 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
        at android.app.ActivityThread.-wrap11(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        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) 
       Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.support.design.widget.NavigationView.getHeaderView(int)' on a null object reference 
        at project_name.activity.HomeActivity.onCreate(HomeActivity.java:93) 
        at android.app.Activity.performCreate(Activity.java:6237) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
        at android.app.ActivityThread.-wrap11(ActivityThread.java)  
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
        at android.os.Handler.dispatchMessage(Handler.java:102)  
        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)  
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Мои действия:

package project_name.activity; 

import android.content.Intent; 
import android.os.Bundle; 
import android.os.Handler; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.NavigationView; 
import android.support.design.widget.Snackbar; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.view.GravityCompat; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.bumptech.glide.Glide; 
import com.bumptech.glide.load.engine.DiskCacheStrategy; 

import project_name.activity.R; 
import project_name.activity.fragment.DashboardFragment; 
import project_name.activity.fragment.PhotosFragment; 
import project_name.activity.other.CircleTransform; 

public class HomeActivity extends AppCompatActivity { 

    private NavigationView navigationView; 
    private DrawerLayout drawer; 
    private View navHeader; 
    private ImageView imgNavHeaderBg, imgProfile; 
    private TextView txtName, txtWebsite; 
    private Toolbar toolbar; 
    private FloatingActionButton fab; 

    // urls to load navigation header background image 
    // and profile image 
    private static final String urlNavHeaderBg = "http://api.androidhive.info/images/nav-menu-header-bg.jpg"; 
    private static final String urlProfileImg = "https://lh3.googleusercontent.com/eCtE_G34M9ygdkmOpYvCag1vBARCmZwnVS6rS5t4JLzJ6QgQSBquM0nuTsCpLhYbKljoyS-txg"; 

    // index to identify current nav menu item 
    public static int navItemIndex = 0; 

    // tags used to attach the fragments 
    private static final String TAG_HOME = "home"; 
    private static final String TAG_PHOTOS = "photos"; 
    private static final String TAG_MOVIES = "movies"; 
    private static final String TAG_NOTIFICATIONS = "notifications"; 
    private static final String TAG_SETTINGS = "settings"; 
    public static String CURRENT_TAG = TAG_HOME; 

    // toolbar titles respected to selected nav menu item 
    private String[] activityTitles; 

    // flag to load home fragment when user presses back key 
    private boolean shouldLoadHomeFragOnBackPress = true; 
    private Handler mHandler; 


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

     mHandler = new Handler(); 

     drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     navigationView = (NavigationView) findViewById(R.id.nav_view); 
     fab = (FloatingActionButton) findViewById(R.id.fab); 

     // Workarounds with Null Pointer Exception 
//  View headerLayout = 
//    navigationView.inflateHeaderView(R.layout.nav_header_home); 
//  navigationView = (NavigationView) headerLayout.findViewById(R.id.nav_view); 
//  navHeader = navigationView.inflateHeaderView(R.layout.nav_header_home); 
//  navHeader = LayoutInflater.from(this).inflate(R.layout.nav_header_home, null); 
//  navigationView.addHeaderView(navHeader); 
//  TextView text = (TextView) navHeader.findViewById(R.id.textView); 
//  text.setText("HELLO"); 
//  navHeader = navigationView.inflateHeaderView(R.layout.nav_header_home); 

     // Navigation view header 
     navHeader = navigationView.getHeaderView(0); 
     txtName = (TextView) navHeader.findViewById(R.id.name); 
     txtWebsite = (TextView) navHeader.findViewById(R.id.website); 
     imgNavHeaderBg = (ImageView) navHeader.findViewById(R.id.img_header_bg); 
     imgProfile = (ImageView) navHeader.findViewById(R.id.img_profile); 

     // load toolbar titles from string resources 
     activityTitles = getResources().getStringArray(R.array.nav_item_activity_titles); 

     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
         .setAction("Action", null).show(); 
      } 
     }); 

     // load nav menu header data 
     loadNavHeader(); 

     // initializing navigation menu 
     setUpNavigationView(); 

     if (savedInstanceState == null) { 
      navItemIndex = 0; 
      CURRENT_TAG = TAG_HOME; 
      loadHomeFragment(); 
     } 
    } 

    /*** 
    * Load navigation menu header information 
    * like background image, profile image 
    * name, website, notifications action view (dot) 
    */ 
    private void loadNavHeader() { 
     // name, website 
     txtName.setText("My Name"); 
     txtWebsite.setText("project_name"); 

     // loading header background image 
     Glide.with(this).load(urlNavHeaderBg) 
       .crossFade() 
       .diskCacheStrategy(DiskCacheStrategy.ALL) 
       .into(imgNavHeaderBg); 

     // Loading profile image 
     Glide.with(this).load(urlProfileImg) 
       .crossFade() 
       .thumbnail(0.5f) 
       .bitmapTransform(new CircleTransform(this)) 
       .diskCacheStrategy(DiskCacheStrategy.ALL) 
       .into(imgProfile); 

     // showing dot next to notifications label 
     navigationView.getMenu().getItem(3).setActionView(R.layout.menu_dot); 
    } 

    /*** 
    * Returns respected fragment that user 
    * selected from navigation menu 
    */ 
    private void loadHomeFragment() { 
     // selecting appropriate nav menu item 
     selectNavMenu(); 

     // set toolbar title 
     setToolbarTitle(); 

     // if user select the current navigation menu again, don't do anything 
     // just close the navigation drawer 
     if (getSupportFragmentManager().findFragmentByTag(CURRENT_TAG) != null) { 
      drawer.closeDrawers(); 

      // show or hide the fab button 
      toggleFab(); 
      return; 
     } 

     // Sometimes, when fragment has huge data, screen seems hanging 
     // when switching between navigation menus 
     // So using runnable, the fragment is loaded with cross fade effect 
     // This effect can be seen in GMail app 
     Runnable mPendingRunnable = new Runnable() { 
      @Override 
      public void run() { 
       // update the main content by replacing fragments 
       Fragment fragment = getHomeFragment(); 
       FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
       fragmentTransaction.setCustomAnimations(android.R.anim.fade_in, 
         android.R.anim.fade_out); 
       fragmentTransaction.replace(R.id.frame, fragment, CURRENT_TAG); 
       fragmentTransaction.commitAllowingStateLoss(); 
      } 
     }; 

     // If mPendingRunnable is not null, then add to the message queue 
     if (mPendingRunnable != null) { 
      mHandler.post(mPendingRunnable); 
     } 

     // show or hide the fab button 
     toggleFab(); 

     //Closing drawer on item click 
     drawer.closeDrawers(); 

     // refresh toolbar menu 
     invalidateOptionsMenu(); 
    } 

    private Fragment getHomeFragment() { 
     switch (navItemIndex) { 
      case 0: 
       // home 
       DashboardFragment homeFragment = new DashboardFragment(); 
       return homeFragment; 
      case 1: 
       // photos 
       PhotosFragment photosFragment = new PhotosFragment(); 
       return photosFragment; 
      case 2: 
       // movies fragment 
       DashboardFragment moviesFragment = new DashboardFragment(); 
       return moviesFragment; 
      case 3: 
       // notifications fragment 
       DashboardFragment notificationsFragment = new DashboardFragment(); 
       return notificationsFragment; 

      case 4: 
       // settings fragment 
       DashboardFragment settingsFragment = new DashboardFragment(); 
       return settingsFragment; 
      default: 
       return new DashboardFragment(); 
     } 
    } 

    private void setToolbarTitle() { 
     getSupportActionBar().setTitle(activityTitles[navItemIndex]); 
    } 

    private void selectNavMenu() { 
     navigationView.getMenu().getItem(navItemIndex).setChecked(true); 
    } 

    private void setUpNavigationView() { 
     //Setting Navigation View Item Selected Listener to handle the item click of the navigation menu 
     navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 

      // This method will trigger on item Click of navigation menu 
      @Override 
      public boolean onNavigationItemSelected(MenuItem menuItem) { 

       //Check to see which item was being clicked and perform appropriate action 
       switch (menuItem.getItemId()) { 
        //Replacing the main content with ContentFragment Which is our Inbox View; 
        case R.id.nav_home: 
         navItemIndex = 0; 
         CURRENT_TAG = TAG_HOME; 
         break; 
        case R.id.nav_photos: 
         navItemIndex = 1; 
         CURRENT_TAG = TAG_PHOTOS; 
         break; 
        case R.id.nav_movies: 
         navItemIndex = 2; 
         CURRENT_TAG = TAG_MOVIES; 
         break; 
        case R.id.nav_notifications: 
         navItemIndex = 3; 
         CURRENT_TAG = TAG_NOTIFICATIONS; 
         break; 
        case R.id.nav_settings: 
         navItemIndex = 4; 
         CURRENT_TAG = TAG_SETTINGS; 
         break; 
        case R.id.nav_about_us: 
         // launch new intent instead of loading fragment 
         startActivity(new Intent(HomeActivity.this, MainActivity.class)); 
         drawer.closeDrawers(); 
         return true; 
        case R.id.nav_privacy_policy: 
         // launch new intent instead of loading fragment 
         startActivity(new Intent(HomeActivity.this, MainActivity.class)); 
         drawer.closeDrawers(); 
         return true; 
        default: 
         navItemIndex = 0; 
       } 

       //Checking if the item is in checked state or not, if not make it in checked state 
       if (menuItem.isChecked()) { 
        menuItem.setChecked(false); 
       } else { 
        menuItem.setChecked(true); 
       } 
       menuItem.setChecked(true); 

       loadHomeFragment(); 

       return true; 
      } 
     }); 


     ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.openDrawer, R.string.closeDrawer) { 

      @Override 
      public void onDrawerClosed(View drawerView) { 
       // Code here will be triggered once the drawer closes as we dont want anything to happen so we leave this blank 
       super.onDrawerClosed(drawerView); 
      } 

      @Override 
      public void onDrawerOpened(View drawerView) { 
       // Code here will be triggered once the drawer open as we dont want anything to happen so we leave this blank 
       super.onDrawerOpened(drawerView); 
      } 
     }; 

     //Setting the actionbarToggle to drawer layout 
     drawer.setDrawerListener(actionBarDrawerToggle); 

     //calling sync state is necessary or else your hamburger icon wont show up 
     actionBarDrawerToggle.syncState(); 
    } 

    @Override 
    public void onBackPressed() { 
     if (drawer.isDrawerOpen(GravityCompat.START)) { 
      drawer.closeDrawers(); 
      return; 
     } 

     // This code loads home fragment when back key is pressed 
     // when user is in other fragment than home 
     if (shouldLoadHomeFragOnBackPress) { 
      // checking if user is on other navigation menu 
      // rather than home 
      if (navItemIndex != 0) { 
       navItemIndex = 0; 
       CURRENT_TAG = TAG_HOME; 
       loadHomeFragment(); 
       return; 
      } 
     } 

     super.onBackPressed(); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 

     // show menu only when home fragment is selected 
     if (navItemIndex == 0) { 
      getMenuInflater().inflate(R.menu.home, menu); 
     } 

     // when fragment is notifications, load the menu created for notifications 
     if (navItemIndex == 3) { 
      getMenuInflater().inflate(R.menu.notifications, menu); 
     } 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_logout) { 
      Toast.makeText(getApplicationContext(), "Logout user!", Toast.LENGTH_LONG).show(); 
      return true; 
     } 

     // user is in notifications fragment 
     // and selected 'Mark all as Read' 
     if (id == R.id.action_mark_all_read) { 
      Toast.makeText(getApplicationContext(), "All notifications marked as read!", Toast.LENGTH_LONG).show(); 
     } 

     // user is in notifications fragment 
     // and selected 'Clear All' 
     if (id == R.id.action_clear_notifications) { 
      Toast.makeText(getApplicationContext(), "Clear all notifications!", Toast.LENGTH_LONG).show(); 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    // show or hide the fab 
    private void toggleFab() { 
     if (navItemIndex == 0) 
      fab.show(); 
     else 
      fab.hide(); 
    } 
} 

Другие виды деятельности и фрагменты не имеют значения, на мой взгляд. Поэтому я дам вам файлы макетов. Вот ящик:

<?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_home" 
     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_home" 
     app:menu="@menu/activity_home_drawer" /> 

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

Заголовок самого ящика:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/view_container" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/nav_header_height" 
    android:gravity="bottom" 
    android:orientation="vertical" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark"> 

    <ImageView 
     android:id="@+id/img_header_bg" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:scaleType="fitXY" 
     android:src="@drawable/favicon" /> 

    <LinearLayout 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true" 
     android:orientation="vertical" 
     android:padding="@dimen/activity_horizontal_margin"> 

     <ImageView 
      android:id="@+id/img_profile" 
      android:layout_width="@dimen/profile_width" 
      android:layout_height="@dimen/profile_height" 
      android:paddingTop="@dimen/nav_header_vertical_spacing" 
      app:srcCompat="@android:drawable/sym_def_app_icon" /> 

     <TextView 
      android:id="@+id/name" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:paddingTop="@dimen/nav_header_vertical_spacing" 
      android:textAppearance="@style/TextAppearance.AppCompat.Body1" /> 

     <TextView 
      android:id="@+id/website" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 

    </LinearLayout> 
</RelativeLayout> 

Пожалуйста, помогите, я действительно потерял в настоящее время.

ответ

0

Когда вы звоните findViewById() ваши Activity «ы макета ищется только, и ваш navigationView в вашем DrawerLayout.

Это вызывает navigationView быть null и вызова getHeaderView(0) на нулевой объект, приводит к NullPointerException.

переключение Попробуйте:

drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
navigationView = (NavigationView) drawer.findViewById(R.id.nav_view); 
+0

Я пробовал это, но это же исключение выбрано. :( – Nagas

0

Пожалуйста, игнорировать этот ответ, если вы уже пробовали. Я чувствую, что ваш код в порядке, просто попробуйте очистить кеш и очистить проект, а затем перезапустить его

Смежные вопросы