Вызов метода с вкладками из фрагмента

У меня есть одна деятельность, состоящая из трех фрагментов. Фрагменты используют вкладки панели действий с помощью PagerAdapter. Я хочу получить доступ к методу в активном фрагменте с вкладкой из основного действия. Я пробовал приведенный ниже код, но это просто возвращает фрагмент как null, поэтому я думаю, что он не может найти его внутри вкладок!

NPListFragment articleFrag = (NPListFragment) getSupportFragmentManager().findFragmentByTag("NP"); articleFrag.refreshT(); 

PagerAdapter:

 public class AppSectionsPagerAdapter extends FragmentPagerAdapter { public AppSectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int i) { switch (i) { case 0: return new NPListFragment(); case 1: return new PListFragment(); case 2: return new FavouritesFragment(); } return null; } @Override public int getCount() { return 3; } 

} Может ли кто-нибудь посоветовать? Я потратил около 6 часов на это, я просто не делаю никакого прогресса, разрешая это.

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

Например :

 public class AppSectionsPagerAdapter extends FragmentPagerAdapter { Fragment one, two, three; public AppSectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int i) { switch (i) { case 0: if(one == null) one = new NPListFragment(); return one; case 1: if(two == null) two= new PListFragment(); return two; case 2: if(three == null) three= new FavouritesFragment(); return three; } return null; } @Override public int getCount() { return 3; } } 

Теперь даже вы в своей деятельности можете вызвать getItem

Вам просто нужно передать его в настоящий класс фрагмента, если вы хотите вызвать конкретный метод.

 int pos = viewpager.getCurrentItem(); Fragment activeFragment = adapter.getItem(pos); if(pos == 0) ((NPListFragment)activeFragment).refreshT(); ... 

Вам необходимо зарегистрировать свои фрагменты во время заполнения, а затем получить доступ к ним извне.

 public class AppSectionsPagerAdapter extends FragmentPagerAdapter { private SparseArray<Fragment> registeredFragments = new SparseArray<>(); public AppSectionsPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int i) { switch (i) { case 0: return new NPListFragment(); case 1: return new PListFragment(); case 2: return new FavouritesFragment(); } return null; } @Override public int getCount() { return 3; } @Override public Object instantiateItem(ViewGroup container, int position) { Fragment fragment = (Fragment) super.instantiateItem(container, position); registeredFragments.put(position, fragment); return fragment; } @Override public void destroyItem(ViewGroup container, int position, Object object) { registeredFragments.remove(position); super.destroyItem(container, position, object); } public Fragment getRegisteredFragment(int position) { return registeredFragments.get(position); } 

Теперь вы можете получать зарегистрированные фрагменты извне

 int pos = viewpager.getCurrentItem(); Fragment fragment = adapter.getRegisteredFragment(pos); switch (pos) { case 0: { ((NPListFragment) fragment).refreshT(); break; } case 1: { ((PListFragment) fragment).refreshK(); break; } case 2: { ((FavouritesFragment) fragment).refreshL(); break; } } 

Я решил эту проблему.

Это происходит потому, что Adapter инициализируется каждый раз, когда новый фрагмент появляется при вызове элемента.

Чтобы решить эту проблему, вам необходимо создать массив Required Fragment в методе onCreate

 Fragment[] FragmentArray; FragmentArray = new Fragment[] {new Fragment 1,new Fragment 2...}; // all fragment goes in array ... get item(int position) ... return FragmentArray[position] ... Fragment1 f= (Fragment1) FragmentArray[0]; f.refresh() // call required function