2016-04-21 2 views
0

У меня есть следующие строки кода, которые я использую для создания навигации для загрузки фрагментов и этого приложения для Android. Я получаю сообщение об ошибке: android.support.v4.app.Fragment.mFragmentManager 'по ссылке нулевого объекта. Я создал фрагменты уже, и навигационное устройство работает.android.support.v4.app.Fragment.mFragmentManager 'по ссылке нулевого объекта

public void selectDrawerItem(MenuItem menuItem){ 

    Fragment fragment = null; 
    Class fragmentClass = null; 

    switch(menuItem.getItemId()){ 
     case R.id.nav_show_all_events_activity: 
      fragmentClass = AllEventsFragment.class; 
      break; 
     case R.id.nav_whats_hot_today_activity: 
      fragmentClass = WhatsHotFragment.class; 
      break; 
    } 

    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()); 
    mDrawer.closeDrawers(); 
} 
+0

Ваш способ создания «фрагмента» несколько странный. Вы уверены, что 'фрагмент' не равен нулю? – Floern

+0

Да, вам не нужно отражать, чтобы создать свой фрагмент, просто вызовите 'фрагмент = новый AllEventsFragment()' или 'fragment = new WhatsHotFragment()' – mbonnin

+0

Я пробовал это с моей первой попытки, и он потерпел неудачу ('fragment = new AllEventsFragment() '). Я уверен, что 'fragment' не является нулевым. –

ответ

0

У вас есть только 2 MenuItems в вашем меню? Если их больше, вы получите фрагмент null. Вы можете добавить случай «по умолчанию» к оператору switch:

switch(menuItem.getItemId()){ 
    case R.id.nav_show_all_events_activity: 
     fragmentClass = AllEventsFragment.class; 
     break; 
    case R.id.nav_whats_hot_today_activity: 
     fragmentClass = WhatsHotFragment.class; 
     break; 
    default: 
     return; 
} 

Это должно гарантировать, что фрагмент не будет равен нулю.

+0

спасибо, что вы забыли добавить 'return'. до сих пор не работает –

0

Я проанализировал код и задался вопросом, почему предыдущий метод не работал. Я нашел незначительную проблему в отношении импорта, который я использовал. Я использовал следующий import android.support.v4.app.Fragment; импорт в main_activity. Видел, что я использовал import android.app.Fragment; в классах AllEventsFragment и WhatsHotFragment, из которых я изменил импорт на import android.support.v4.app.Fragment; Благодарим за помощь. Конечный вариант:

public void selectDrawerItem(MenuItem menuItem){ 

    FragmentManager manager = getSupportFragmentManager(); 
    FragmentTransaction transaction = manager.beginTransaction(); 
    Fragment fragment; 

    switch(menuItem.getItemId()){ 
     case R.id.nav_show_all_events_activity: 
      fragment = new AllEventsFragment(); 
      break; 
     case R.id.nav_whats_hot_today_activity: 
      fragment = new WhatsHotFragment(); 
      break; 
     default: 
      return; 
    } 

    transaction.replace(R.id.flContent, fragment); 
    transaction.commit(); 

    menuItem.setChecked(true); 
    setTitle(menuItem.getTitle()); 
    mDrawer.closeDrawers(); 
}