2014-10-10 3 views
0

Я начал кодировать небольшое приложение, используя предварительно установленный вкладкой Layout Layout с помощью фрагментов (SectionsPagerAdapter, ViewPager).Android: доступ к экземпляру фрагмента из MainActivity

У меня есть задача, которая выполняется в главном/Ui нить MainActivity.class, которая в одной точке показывает диалоговое окно с помощью метода OnClick

@Override 
     public void onClick(DialogInterface dialog, int which) { 
      category = eventsToDisplay.get(which); 
      averageFragment.category = category; 
      dialog.dismiss(); 
     } 

Но я не могу получить averageFragment.category = category; назначение на работу.

В методе onCreate MainActivity я вызываю averageFragment = (AverageFragment) getSupportFragmentManager().findFragmentByTag(AverageFragment.tag);, но это дает мне исключение NullPointerException.

Я уже пробовал следующие решения (большинство из которых с этого сайта):

  • getSupportFragmentManager().findFragmentById(R.id.fragment_average)
  • getSupportFragmentManager().findFragmentByTag(AverageFragment.tag) < - в основном статическая переменная, созданная при создании экземпляра фрагмента.
  • mSectionsPageAdapter.getItem(1)

все из которых дают мне либо NPE или IllegalStateException.FragmentNotAttachedToView.

Другое соответствующий код:

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     // getItem is called to instantiate the fragment for the given page. 
     switch (position) { 
      case 0: 
       return InspectionFragment.newInstance(position + 1); 
      case 1: 
       return AverageFragment.newInstance(position + 1); 
      case 2: 
       return RegulationsFragment.newInstance(position + 1); 
     } 
     return null; 
    } 

    @Override 
    public int getCount() { 
     // Show 3 total pages. 
     return 3; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     Locale l = Locale.getDefault(); 
     switch (position) { 
      case 0: 
       return getString(R.string.title_section1).toUpperCase(l); 
      case 1: 
       return getString(R.string.title_section2).toUpperCase(l); 
      case 2: 
       return getString(R.string.title_section3).toUpperCase(l); 
     } 
     return null; 
    } 
} 

Любые идеи о том, как получить доступ фрагмент от основной деятельности?

ответ

0

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

averageFragment = (AverageFragment) getSupportFragmentManager().findFragmentByTag(AverageFragment.tag); 

от метода OnCreate(). Попробуйте переместить это назначение в onResume(), чтобы убедиться, что ваш фрагмент загружен в представление и доступен через supportFragmentManager. Также убедитесь, что это назначение происходит после установки адаптера пейджера в течение жизненного цикла вашей активности.

+0

Работает отлично! Благодаря :) – suushiemaniac

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