1

У меня есть viewpager во фрагменте, который работает правильно при запуске, но если перезагрузить фрагмент, замените() или замените другим фрагментом, а затем снова загрузите его. Просмотрщик работает неправильно. У меня есть 4 вкладки в моем пейджере, и в зависимости от того, какие вкладки были выбраны, остальные вкладки будут пустыми. Например, если первая закладка выбрана, первая вкладка будет пустой, а другая 3 будет работать, когда я перезагружу фрагмент viewpager. Или, если выбрана третья вкладка, первая и четвертая вкладки отображаются пустыми, а вторая и третья вкладки работают правильно. Не уверен, если это связано, но если не называть removeAllTabs() на Destory язычки появляются дважды в ActionBarViewpager Tabs Fragment

редактировать: Я знаю, распорядилась так, что если я нажимаю на рабочих вкладок и немного подождать представления в viewpager, где отображается пустое место. Может ли такое поведение быть результатом того, что 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(); 
} 
} 

ответ

0

Найдено ответов: getChildFragmentManager().

В приведенном выше коде, это фиксирует это:

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

Вы можете добавить немного больше деталей? – gcbenison

+0

Я добавил изменения – user1634451

Смежные вопросы