2015-04-12 30 views
5

Mam jedną czynność składającą się z trzech fragmentów. Fragmenty używają zakładek paska akcji za pomocą PagerAdaptera. Co chcę zrobić, to uzyskać dostęp do metody z aktywnego fragmentu z kartami. Próbowałem poniższy kod, ale to po prostu zwraca fragment jako null, więc myślę, że nie można go znaleźć w zakładkach!Metoda wywołania z kartami połączeń z działania

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; 
} 

} Może ktoś doradzić? Spędziłem w tej sprawie około 6 godzin, po prostu nie robię żadnego postępu w rozwiązywaniu tego problemu.

+0

można pokazać swoją PagerAdapter? –

+0

dodany adapter pager - dziękuje – user2029541

Odpowiedz

13

Co należy zrobić: utworzyć tylko raz każdy fragment, a następnie nadać go dla wszystkich wywołań metody getItem.

Na przykład:

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; 
} 

} 

Teraz, nawet ty w swojej działalności można nazwać getItem

Będziesz wystarczy oddać go do rzeczywistej klasy fragmentu jeśli chcesz wywołać specyficzną metodę .

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

fajne rozwiązanie, ale otrzymuję wskaźnik NULL z wyjątkiem widoków, gdy próbowałem uzyskać do nich dostęp w postaci fragmentu. Dzieje się tak tylko po zresetowaniu adaptera między dostępem do widoków. Dowolny pomysł? – VinKrish

+1

Spowoduje to utworzenie kolejnego pustego fragmentu, a jego widoki będą puste. Musisz zarejestrować wcześniej utworzone fragmenty i uzyskać do nich dostęp za pomocą metody pobierającej. –

2

Musisz zarejestrować swoje fragmenty podczas wypełniania, a następnie uzyskać do nich dostęp z zewnątrz.

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); 
} 

Teraz można dostać registeredFragments z zewnątrz

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; 
    } 
} 
1

I rozwiązać ten problem.

Dzieje się tak, ponieważ adapter jest inicjowany za każdym razem, gdy nowy Fragment zostanie wywołany.

Do tego trzeba wykonać szereg wymaganych Fragment w onCreate metody rozwiązywania

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