0

Ich verwende eine TabLayout + ViewPager, um ein paar Registerkarten anzuzeigen. Abhängig von einer Serverantwort möchte ich zwei mögliche Szenarien erstellen: In der ersten gibt es drei Registerkarten und in der zweiten gibt es nur zwei, die Registerkarte in Position 0 "entfernen".Umgang mit TabLayout mit mehreren Szenarien

Da bin ich "Entfernen" Auf der ersten Registerkarte werden alle Methoden, die sich auf die Position stützen, um etwas auszuführen, das mit einem bestimmten Fragment zusammenhängt, veraltet und werden wahrscheinlich die Prüfung instanceof nicht bestehen.

Zum Beispiel ist dies getItem in FragmentStatePagerAdapter, das ist nicht das zweite Szenario im Moment nicht verarbeitet:

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

Listener Beispiel in MainActivity (Check fehl im zweiten Szenario):

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

} 

Meine einzige Idee ist es, die Server-Antwort (dh wenn es zwei oder drei Registerkarten gibt) in jedem Listener in MainActivity und in jedem Fall in getItem, die eine schreckliche s ist zu überprüfen Lösung meiner Meinung nach. Gibt es einen besseren Weg, damit umzugehen?

Antwort

1

Da es nur wenige Tabs sind ein guter Ansatz wäre, eine Liste von Fragmenten machen Sie wollen zeigen:

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

und dann bei getItem Verfahren, wie das tun:

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

Wenn Sie ein bestimmtes Fragment benötigen, können Sie die fragments-Liste abrufen und darüber iterieren, indem Sie die instanceof testen.

Lassen Sie mich wissen, ob es Ihnen hilft.

+0

@NeriaNachum hat dies Ihr Problem gelöst? Wenn ja, bitte akzeptieren Sie die Antwort –

0

Sie können benutzerdefiniertes Fragment Pager-Adapter verwenden Fragmente von

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

nur um Ihre viewPager Adapter-Klasse zu erweitern, indem FragmentPagerAdapter

das Fragment in Ihrer Tätigkeit zu erhalten.

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