2015-04-12 35 views
5

我有一個活動包含三個片段。這些片段使用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

回答

13

你應該做的是:每個片段只創建一次,然後給所有對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方法訪問它們。 –

2

您需要在填充時註冊片段,然後從外部訪問它們。

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

得到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 
相關問題