调用活动的选项卡式片段方法

问题描述:

我有一个活动包含三个片段。这些片段使用PagerAdapter使用操作栏选项卡。我想要做的是在主活动的活动选项卡片段中访问一个方法。我已经尝试了下面的代码,但这只是返回片段为空,所以我想它无法在标签中找到它!调用活动的选项卡式片段方法

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个小时,我只是没有取得任何进展,解决这个问题。

+0

你能告诉你的PagerAdapter? –

+0

增加了寻呼机适配器 - 谢谢 – user2029541

你应该做的是:每个片段只创建一次,然后给所有对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(); 
... 
+0

不错的解决方案,但当我试图访问它们的片段时,我得到视图的空指针异常。这只是在我访问视图之间重置适配器之后才会发生。任何想法? – VinKrish

+1

这将创建另一个空片段,其视图将为空。您需要注册以前创建的片段并通过getter方法访问它们。 –

您需要在填充时注册片段,然后从外部访问它们。

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

得到registeredFragments我解决了这个问题。

发生这种情况的原因是Adapter每次调用get项目时都会初始化一个新的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