Viewpager标签片段 [英] Viewpager Tabs Fragment

本文介绍了Viewpager标签片段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在上启动该工作正常片段的viewpager但如果重装通过更换片段()或另一片段取代然后再加载它。该viewpager不能正常工作。我在我的寻呼机4个选项卡,并根据其标签被当前选择其他选项卡将显示为空白。例如,如果有第一个选项卡中选择第一个选项卡会显示为空白,当我重新加载viewpager片段其他3将工作。或者,如果选择了第三个选项卡中的第一和第四选项卡出现空白,第二和第三个选项卡正常工作。不知道这是相关的,但如果不上destory调用removeAllTabs()选项卡中的动作条出现两次

编辑:
我知道有它这样,如果我在viewpager,凡空白显示了点击工作标签和等一会的意见。难道这种行为是被嵌套在一个片段viewpager的结果?

 公共类ActionBarTabsPager扩展SherlockFragment {
ViewPager mViewPager;
TabsAdapter mTab​​sAdapter;@覆盖
保护无效initView(捆绑savedInstanceState){    最后的动作条酒吧= getActionBar();
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    bar.setDisplayOptions(0,ActionBar.DISPLAY_SHOW_TITLE);    mTabsAdapter =新TabsAdapter(这一点,mViewPager);
    mTabsAdapter.addTab(bar.newTab()的setText(简单),
            CountingFragment.class,NULL);
    mTabsAdapter.addTab(bar.newTab()的setText(目​​录),
            FragmentPagerSupport.ArrayListFragment.class,NULL);
    mTabsAdapter.addTab(bar.newTab()的setText(光标),
            CursorFragment.class,NULL);
    mTabsAdapter.addTab(bar.newTab()的setText(其他),
            AnotherFragment.class,NULL);    如果(savedInstanceState!= NULL){
        bar.setSelectedNavigationItem(savedInstanceState.getInt(标签,0));
    }
} @覆盖
公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
        捆绑savedInstanceState){    查看rootView = inflater.inflate(R.layout.activity_main,集装箱,
            假);
    mViewPager =(ViewPager)rootView.findViewById(R.id.view_holder);
    initView(savedInstanceState);
    返回rootView;
}@覆盖
保护无效的onSaveInstanceState(捆绑outState){
    super.onSaveInstanceState(outState);
    outState.putInt(标签,getActionBar()getSelectedNavigationIndex());
}/ **
 *这是实现标签和所有的管理的辅助类
 *连接ViewPager关联TabHost的细节。它依赖于
 *把戏。通常,标签主机有一个简单的API,用于提供视图或
 *意图,每个标签将显示。这是不够的,用于切换
 *页面之间。因此,不是我们做的标签主机的部分内容
 * 0dp高(它未示出)和TabsAdapter提供其自己的虚设
 *视图,以显示作为标签内容。它监听到标签的变化,并采取
 *护理开关在ViewPager正确的分页中,只要选定
 *标签的变化。
 * /
公共静态类TabsAdapter扩展FragmentPagerAdapter
        实现ActionBar.TabListener,ViewPager.OnPageChangeListener {
    私人最终上下文mContext;
    私人最终动作条mActionBar;
    私人最终ViewPager mViewPager;
    私人最终的ArrayList< TabInfo> mTabs =新的ArrayList< TabInfo>();    静态final类TabInfo {
        私人最终级<> CLSS;
        私人最终捆绑ARGS;        TabInfo(类<> _class,捆绑_args){
            CLSS = _class;
            ARGS = _args;
        }
    }    公共TabsAdapter(活动活动,ViewPager寻呼机){
        超级(activity.getFragmentManager());
        mContext =活动;
        mActionBar = activity.getActionBar();
        mViewPager =寻呼机;
        mViewPager.setAdapter(本);
        mViewPager.setOnPageChangeListener(本);
    }    公共无效addTab(ActionBar.Tab标签,类<> CLSS,捆绑参数){
        TabInfo信息=新TabInfo(CLSS,参数);
        tab.setTag(信息);
        tab.setTabListener(本);
        mTabs.add(信息);
        mActionBar.addTab(标签);
        notifyDataSetChanged();
    }    @覆盖
    公众诠释的getCount(){
        返回mTabs.size();
    }    @覆盖
    公共片段的getItem(INT位置){
        TabInfo信息= mTab​​s.get(位置);
        返回Fragment.instantiate(mContext,info.clss.getName(),info.args);
    }    @覆盖
    公共无效onPageScrolled(INT位置,浮positionOffset,诠释positionOffsetPixels){
    }    @覆盖
    公共无效使用onPageSelected(INT位置){
        mActionBar.setSelectedNavigationItem(位置);
    }    @覆盖
    公共无效onPageScrollStateChanged(INT状态){
    }    @覆盖
    公共无效onTabSelected(标签选项卡,FragmentTransaction英尺){
        对象标记= tab.getTag();
        的for(int i = 0; I< mTab​​s.size();我++){
            如果(mTabs.get(ⅰ)==标签){
                mViewPager.setCurrentItem(ⅰ);
            }
        }
    }    @覆盖
    公共无效onTabUnselected(标签选项卡,FragmentTransaction英尺){
    }    @覆盖
    公共无效onTabReselected(标签选项卡,FragmentTransaction英尺){
    }
}
 @覆盖
公共无效onDestroyView(){
    super.onDestroyView();
    mActionBar.removeAllTabs();
}
}


解决方案

找到了答案:用 getChildFragmentManager()

在上面的code,这种修复它:

 公共TabsAdapter(SherlockFragment FRAG,ViewPager寻呼机){
    超级(frag.getChildFragmentManager());
    mContext = frag.getActivity();
    mActionBar = mContext.getActionBar();
    mViewPager =寻呼机;
    mViewPager.setAdapter(本);
    mViewPager.setOnPageChangeListener(本);
}

I have a viewpager in a fragment that works correctly on start up but if reload the fragment by replace() or replace with another fragment then load it again. The viewpager doesn't work correctly. I have 4 tabs in my pager and depending on which tabs was currently selected the other tabs will appear blank. For example if have the first tab selected the first tab will appear blank and the other 3 will work when i reload the viewpager fragment. Or if the third tab was selected the first and fourth tabs appear blank and the second and third tabs work correctly. Not sure if this is related but if don't call removeAllTabs() on destory the tabs appear twice in the actionbar

edit: I know have it so that if I click on the working tabs and wait a bit the views in the viewpager that where blank show up. Could this behavior be a result of the viewpager being nested in a fragment?

 public class ActionBarTabsPager extends SherlockFragment{
ViewPager mViewPager;
TabsAdapter mTabsAdapter;

@Override
protected void initView(Bundle savedInstanceState) {

    final ActionBar bar = getActionBar();
    bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);

    mTabsAdapter = new TabsAdapter(this, mViewPager);
    mTabsAdapter.addTab(bar.newTab().setText("Simple"),
            CountingFragment.class, null);
    mTabsAdapter.addTab(bar.newTab().setText("List"),
            FragmentPagerSupport.ArrayListFragment.class, null);
    mTabsAdapter.addTab(bar.newTab().setText("Cursor"),
            CursorFragment.class, null);
    mTabsAdapter.addTab(bar.newTab().setText("Another"),
            AnotherFragment.class, null);

    if (savedInstanceState != null) {
        bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
    }
}

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.activity_main, container,
            false);
    mViewPager = (ViewPager) rootView.findViewById(R.id.view_holder);
    initView(savedInstanceState);
    return rootView;
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("tab", getActionBar().getSelectedNavigationIndex());
}

/**
 * This is a helper class that implements the management of tabs and all
 * details of connecting a ViewPager with associated TabHost.  It relies on a
 * trick.  Normally a tab host has a simple API for supplying a View or
 * Intent that each tab will show.  This is not sufficient for switching
 * between pages.  So instead we make the content part of the tab host
 * 0dp high (it is not shown) and the TabsAdapter supplies its own dummy
 * view to show as the tab content.  It listens to changes in tabs, and takes
 * care of switch to the correct paged in the ViewPager whenever the selected
 * tab changes.
 */
public static class TabsAdapter extends FragmentPagerAdapter
        implements ActionBar.TabListener, ViewPager.OnPageChangeListener {
    private final Context mContext;
    private final ActionBar mActionBar;
    private final ViewPager mViewPager;
    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();

    static final class TabInfo {
        private final Class<?> clss;
        private final Bundle args;

        TabInfo(Class<?> _class, Bundle _args) {
            clss = _class;
            args = _args;
        }
    }

    public TabsAdapter(Activity activity, ViewPager pager) {
        super(activity.getFragmentManager());
        mContext = activity;
        mActionBar = activity.getActionBar();
        mViewPager = pager;
        mViewPager.setAdapter(this);
        mViewPager.setOnPageChangeListener(this);
    }

    public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) {
        TabInfo info = new TabInfo(clss, args);
        tab.setTag(info);
        tab.setTabListener(this);
        mTabs.add(info);
        mActionBar.addTab(tab);
        notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return mTabs.size();
    }

    @Override
    public Fragment getItem(int position) {
        TabInfo info = mTabs.get(position);
        return Fragment.instantiate(mContext, info.clss.getName(), info.args);
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    }

    @Override
    public void onPageSelected(int position) {
        mActionBar.setSelectedNavigationItem(position);
    }

    @Override
    public void onPageScrollStateChanged(int state) {
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        Object tag = tab.getTag();
        for (int i=0; i<mTabs.size(); i++) {
            if (mTabs.get(i) == tag) {
                mViewPager.setCurrentItem(i);
            }
        }
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
    }
}
 @Override
public void onDestroyView() {
    super.onDestroyView();
    mActionBar.removeAllTabs();
}
}

解决方案

Found the answer: use getChildFragmentManager().

In the above code, this fixes it:

  public TabsAdapter(SherlockFragment frag, ViewPager pager) {
    super(frag.getChildFragmentManager());
    mContext = frag.getActivity();
    mActionBar = mContext.getActionBar();
    mViewPager = pager;
    mViewPager.setAdapter(this);
    mViewPager.setOnPageChangeListener(this);
}

这篇关于Viewpager标签片段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆