0

我使用TabLayout + ViewPager來顯示幾個選項卡。根據服務器響應,我想要創建兩種可能的方案:第一個中有三個選項卡,第二個中只有兩個,即「刪除」位置0中的選項卡。處理多種場景的TabLayout

由於我正在'在第一個選項卡中,所有依賴位置執行與某個特定片段相關的任何方法都變得過時,並且很可能會通過instanceof檢查。

例如,這是FragmentStatePagerAdaptergetItem,它不會在瞬間處理第二個場景:

@Override 
public Fragment getItem(int position) { 
    AbstractFragment fragment; 
    switch (position) { 
     case 0: 
      fragment = new MainFragment(); 
      break; 
     case 1: 
      fragment = new MessagesFragment(); 
      break; 
     case 2: 
      fragment = new SearchFragment(); 
      break; 
     default: 
      return null; 
    } 
    return fragment; 
} 

偵聽例如MainActivity(支票將在第二個方案失敗):

Fragment fragment = viewPagerAdapter.getRegisteredFragment(2); 
if (fragment instanceof SearchFragment) { 
    ((SearchFragment)fragment).doStuff(); 

} 

我唯一的想法是檢查服務器響應(即,如果有兩個或三個選項卡),在每一個聽者MainActivity,並在每getItem的情況下,這是一個可怕的小號在我看來的解決方案。有沒有更好的方法來處理這個問題?

回答

1

由於只有幾個標籤,一個好的辦法是讓你想顯示片段的列表:

List<AbstractFragment> fragments = new ArrayList<>(); 
if (showFirstTab) { 
    fragments.add(new MainFragment()); 
} 
fragments.add(new MessagesFragment()); 
fragments.add(new SearchFragment()); 

,然後在getItem方法,做這樣的:

@Override 
public Fragment getItem(int position) { 
    if (fragments.size() > position) { 
     return fragments.get(position); 
    } 
    return null; 
} 

當您需要獲取特定片段時,可以獲取fragments列表並在其上測試instanceof

讓我知道它是否對你有幫助。

+0

@NeriaNachum這是否解決了您的問題?如果是,請接受答案 –

0

可以使用自定義片段尋呼機適配器通過

位置
public abstract class FragmentPagerAdapter extends PagerAdapter { 
    private static final String TAG = "FragmentPagerAdapter"; 
    private static final boolean DEBUG = false; 

    private final FragmentManager mFragmentManager; 
    private FragmentTransaction mCurTransaction = null; 
    private Fragment mCurrentPrimaryItem = null; 
    private String mAdapterClassName; 

    protected FragmentPagerAdapter(FragmentManager fm, String adapterClassName) { 
     mFragmentManager = fm; 
     mAdapterClassName = adapterClassName; 
    } 

    /** 
    * Return the Fragment associated with a specified position. 
    */ 
    protected abstract Fragment getItem(int position); 

    @Override 
    public void startUpdate(ViewGroup container) { 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     if (mCurTransaction == null) { 
      mCurTransaction = mFragmentManager.beginTransaction(); 
     } 

     // Do we already have this fragment? 
     String name = makeFragmentTag(position); 
     Fragment fragment = mFragmentManager.findFragmentByTag(name); 
     if (fragment != null) { 
      mCurTransaction.attach(fragment); 
     } else { 
      fragment = getItem(position); 
      mCurTransaction.add(container.getId(), fragment, 
        makeFragmentTag(position)); 
     } 
     if (fragment != mCurrentPrimaryItem) { 
      fragment.setMenuVisibility(false); 
      fragment.setUserVisibleHint(false); 
     } 

     return fragment; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     if (mCurTransaction == null) { 
      mCurTransaction = mFragmentManager.beginTransaction(); 
     } 
     mCurTransaction.detach((Fragment) object); 
    } 

    @Override 
    public void setPrimaryItem(ViewGroup container, int position, Object object) { 
     Fragment fragment = (Fragment) object; 
     if (fragment != mCurrentPrimaryItem) { 
      if (mCurrentPrimaryItem != null) { 
       mCurrentPrimaryItem.setMenuVisibility(false); 
       mCurrentPrimaryItem.setUserVisibleHint(false); 
      } 
      if (fragment != null) { 
       fragment.setMenuVisibility(true); 
       fragment.setUserVisibleHint(true); 
      } 
      mCurrentPrimaryItem = fragment; 
     } 
    } 

    @Override 
    public void finishUpdate(ViewGroup container) { 
     if (mCurTransaction != null) { 
      mCurTransaction.commitAllowingStateLoss(); 
      mCurTransaction = null; 
      mFragmentManager.executePendingTransactions(); 
     } 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object object) { 
     return ((Fragment) object).getView() == view; 
    } 

    @Override 
    public Parcelable saveState() { 
     return null; 
    } 

    @Override 
    public void restoreState(Parcelable state, ClassLoader loader) { 
    } 

    /** 
    * Return a unique identifier for the item at the given position. 
    * <p/> 
    * <p>The default implementation returns the given position. 
    * Subclasses should override this method if the positions of items can change.</p> 
    * 
    * @param position Position within this adapter 
    * @return Unique identifier for the item at position 
    */ 
    private long getItemId(int position) { 
     return position; 
    } 

    public String makeFragmentTag(int position) { 
     return "purplle:switcher:" + mAdapterClassName + ":" + position; 
    } 

    public static String makeFragmentTag(int position,String adapterClassName) { 
     return "purplle:switcher:" + adapterClassName + ":" + position; 
    } 
} 

獲得片段現在只需通過FragmentPagerAdapter

擴展您的viewPager適配器類來獲取片段的活性。

getSupportFragmentManager().findFragmentByTag(mPagerAdapter.makeFragmentTag(0) //Postion of fragment to access