【问题标题】:Handling TabLayout with multiple scenarios多场景处理 TabLayout
【发布时间】:2017-02-14 10:50:06
【问题描述】:

我正在使用TabLayout + ViewPager 来显示一些标签。根据服务器响应,我想创建两种可能的场景:第一个有三个选项卡,第二个只有两个,“删除”位置 0 的选项卡。

由于我要“删除”第一个选项卡,所有依赖位置来执行与特定片段相关的任何操作的方法都已过时,并且可能无法通过 instanceof 检查。

例如这是FragmentStatePagerAdapter中的getItem,目前不处理第二种情况:

@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();

}

我唯一的想法是检查MainActivitygetItem 中每个侦听器中的服务器响应(即是否有两个或三个选项卡),我认为这是一个糟糕的解决方案。有没有更好的方法来处理这个问题?

【问题讨论】:

    标签: java android android-viewpager android-tablayout fragmentstatepageradapter


    【解决方案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

    如果对你有帮助,请告诉我。

    【讨论】:

    • @NeriaNachum 这解决了您的问题吗?如果是,请采纳答案
    【解决方案2】:

    您可以使用自定义片段寻呼机适配器按位置获取片段

    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 
    

    【讨论】:

      猜你喜欢
      • 2015-04-08
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 2014-05-07
      • 2012-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多