2015-10-21 2 views
-1

Это onCreate, и это дает NPE на mDrawerList.setOnItemClickListener (this) Я просто хочу создать меню списка со значками страны и текстом вроде: русский, английский, итальянский. Когда пользователь нажимает на него, он должен изменить язык локали приложения. Я решил использовать DrawerNavigation вместо добавления всех разных языков в OverFlowMenu.mDrawerList.setOnItemClickListener NPE

@SuppressLint("NewApi") 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(activity_main); 

      /** 
      * 
      * 
      * 
      * 
      */ 

      mTitle = mDrawerTitle = getTitle(); 

      // load slide menu items 
      navMenuTitles = getResources().getStringArray(nav_drawer_items); 

      // nav drawer icons from resources 
      navMenuIcons = getResources() 
        .obtainTypedArray(nav_drawer_icons); 

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

      mDrawerList = (ListView) findViewById(list_slidermenu); 

      navDrawerItems = new ArrayList<>(); 

      // adding nav drawer items to array 
      // English language 
      navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1))); 
      // Russian language 
      navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1))); 
      // Italian language 
      navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1))); 


      // Recycle the typed array 
      navMenuIcons.recycle(); 

      mDrawerList.setOnItemClickListener(this); 

      // setting the nav drawer list adapter 
      adapter = new NavDrawerListAdapter(getApplicationContext(), 
        navDrawerItems); 
      mDrawerList.setAdapter(adapter); 

      // enabling action bar app icon and behaving it as toggle button 
      getActionBar().setDisplayHomeAsUpEnabled(true); 
      getActionBar().setHomeButtonEnabled(true); 

      mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
        R.drawable.ic_drawer, //nav menu toggle icon 
        R.string.app_name, // nav drawer open - description for accessibility 
        R.string.app_name // nav drawer close - description for accessibility 
      ) { 
       public void onDrawerClosed(View view) { 
        getActionBar().setTitle(mTitle); 
        // calling onPrepareOptionsMenu() to show action bar icons 
        invalidateOptionsMenu(); 
       } 

       public void onDrawerOpened(View drawerView) { 
        getActionBar().setTitle(mDrawerTitle); 
        // calling onPrepareOptionsMenu() to hide action bar icons 
        invalidateOptionsMenu(); 
       } 
      }; 
      mDrawerLayout.setDrawerListener(mDrawerToggle); 

      /*if (savedInstanceState == null) { 
       // on first time display view for first nav item 
       displayView(0); 
      }*/ 
      /** 
      * 
      * 
      * 
      * 
      */ 


      storyButtonMainBody = (Button) findViewById(storyButton); 
      storyButtonMainBody.setOnClickListener(this); 

      specSectButton = (Button) findViewById(specSectionButtonId); 
      specSectButton.setOnClickListener(this); 

      webRegistryButton = (Button) findViewById(e_registryId); 
      webRegistryButton.setOnClickListener(this); 

      feedBackButton = (Button) findViewById(feedback); 
      feedBackButton.setOnClickListener(this); 

      findUsButton = (Button) findViewById(findus); 
      findUsButton.setOnClickListener(this); 

      communicationButton = (Button) findViewById(R.id.button_show_comunications); 
      communicationButton.setOnClickListener(this); 
      makeActionOverflowMenuShown(); 
     } 

     /*private class SlideMenuClickListener implements 
       OnItemClickListener { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, 
            long id) { 
       // display view for selected nav drawer item 
       displayView(position); 
      } 
     }*/ 

     /* * 
     * Called when invalidateOptionsMenu() is triggered 
     */ 
     @Override 
     public boolean onPrepareOptionsMenu(Menu menu) { 
      // if nav drawer is opened, hide the action items 
      boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); 
      menu.findItem(R.id.action_settings).setVisible(!drawerOpen); 
      return super.onPrepareOptionsMenu(menu); 
     } 


     /** 
     * Diplaying fragment view for selected nav drawer list item 
     */ 
     private void displayView(int position) { 
      // update the main content by replacing fragments 
      Fragment fragment = null; 
      switch (position) { 
       case 0: 
        Locale locale = new Locale("en"); 
        Locale.setDefault(locale); 
        Configuration config = new Configuration(); 
        config.locale = locale; 
        getBaseContext() 
          .getResources() 
          .updateConfiguration(config, getBaseContext() 
            .getResources() 
            .getDisplayMetrics()); 
        restartActivity(); 
        Toast.makeText(this, R.string.locale_lang, LENGTH_LONG).show(); 
        break; 
       case 1: 
        Locale locale2 = new Locale("ru"); 
        Locale.setDefault(locale2); 
        Configuration config2 = new Configuration(); 
        config2.locale = locale2; 
        getBaseContext() 
          .getResources() 
          .updateConfiguration(config2, getBaseContext() 
            .getResources() 
            .getDisplayMetrics()); 
        restartActivity(); 
        Toast.makeText(this, R.string.locale_lang, LENGTH_LONG).show(); 
        break; 
       case 2: 
        Locale locale3 = new Locale("it"); 
        Locale.setDefault(locale3); 
        Configuration config3 = new Configuration(); 
        config3.locale = locale3; 
        getBaseContext() 
          .getResources() 
          .updateConfiguration(config3, getBaseContext() 
            .getResources() 
            .getDisplayMetrics()); 
        restartActivity(); 
        Toast.makeText(this, R.string.locale_lang, LENGTH_LONG).show(); 
        break; 
      } 

      if (fragment != null) { 

       FragmentManager fragmentManager = getFragmentManager(); 
       fragmentManager.beginTransaction() 
         .replace(R.id.frame_container, fragment).commit(); 

       // update selected item and title, then close the drawer 
       mDrawerList.setItemChecked(position, true); 
       mDrawerList.setSelection(position); 
       setTitle(navMenuTitles[position]); 
       mDrawerLayout.closeDrawer(mDrawerList); 
      } else { 
       // error in creating fragment 
       Log.e("MainActivity", "Error in creating fragment"); 
      } 
     } 
+0

Опубликовать полный код вашего метода onCreate() (переменная mDrawerList равна нулю) – bonnyz

+0

Проверить номер 116 вашего основного действия, вызывающего проблему. – Toppers

+0

Да, но его строка с // некоторым комментарием –

ответ

0

На этой линии

mDrawerList = (ListView) findViewById(list_slidermenu); 

вы ищете вид (чей идентификатор хранится в list_slidermenu), который не существует в файле макета, идентифицированной переменной activity_main

Проверьте, как вы назначаете activity_main и list_slidermenu, они должны быть действительными идентификаторами андроида R (, такими как R.id.drawer_layout); если нет, вот в чем проблема. После этого откройте файл макета, проверьте элемент, идентифицированный list_slidermenu.

+0

Hm ... Я нашел эту проблему, но еще одна проблема: Я хочу добавить навигацию к моему существующему проекту без изменения содержимого (activity_main); –

+0

@ArnoldMrARNOLDCharyyev Это совершенно не связано с вашим первоначальным вопросом (вы спросили об исключении NPE). Если вы решили ЭТУ проблему, отметьте этот вопрос, а затем, только если это действительно необходимо, откройте новый конкретный вопрос. – bonnyz

+0

Понял. Кажется, что эта проблема исправлена, но после этой проблемы у меня появился новый NPE на mDrawerLayout.setDrawerListener (mDrawerToggle); –