简体   繁体   English

Viewpager选项卡片段

[英]Viewpager Tabs Fragment

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. 我在片段中有一个viewpager,它在启动时可以正常工作,但是如果通过replace()重新加载该片段或用另一个片段替换,则再次加载它。 The viewpager doesn't work correctly. viewpager无法正常工作。 I have 4 tabs in my pager and depending on which tabs was currently selected the other tabs will appear blank. 我的寻呼机中有4个选项卡,根据当前选择的选项卡,其他选项卡将显示为空白。 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. 例如,如果选择了第一个选项卡,则当我重新加载viewpager片段时,第一个选项卡将显示为空白,其他三个选项卡将起作用。 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 不知道这是否相关,但是如果不调用destory上的removeAllTabs(),则选项卡在操作栏中会出现两次

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. 编辑:我知道有它,所以如果我单击工作选项卡上,然后稍等一下在viewpager中空白显示的视图。 Could this behavior be a result of the viewpager being nested in a fragment? 这可能是由于viewpager嵌套在片段中的结果吗?

 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() . 找到了答案:使用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);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM