1

我有一个使用片段和 ActionBarSherlock 构建的选项卡式应用程序。我有 3 个选项卡,有 3 个 ListFragment's 这就是正在发生的事情。

当我选择任何选项卡时,关联片段的 onCreate 方法会在第一次按预期调用,但不会在第二次调用。问题是下一个相邻选项卡调用了 onCreate 方法,但未选择选项卡。

单击 tab2 并调用 tab3 的 onCreate 但不调用 tab2。

实际上我的要求是,当我更改tab1中的一些数据时,意味着fragment1。这些更改在 fragment2 中不受影响,当我选择 tab2 (fragment2) 时,这意味着 fragment2 onCreate() 没有调用。为什么它没有正确刷新片段。这是我正在使用的适配器。

private class TabsAdapter extends FragmentPagerAdapter implements ViewPager.OnPageChangeListener, ActionBar.TabListener {

    public TabsAdapter(FragmentActivity activity, ActionBar actionBar, ViewPager pager) {
        super(activity.getSupportFragmentManager());
        mContext = activity;
        mActionBar = actionBar;
        mViewPager = pager;
        mViewPager.setAdapter(this);
        mViewPager.setOnPageChangeListener(this);
    }

    public void addTab(ActionBar.Tab tab, Class<?> clss, int tabId) {
        mTabs.add(clss.getName());
        mTabsId.add(tabId);
        mActionBar.addTab(tab.setTabListener(this));
        notifyDataSetChanged();
    }

    public Integer getIdForPosition(int position) {
        if (position >= 0 && position < mTabsId.size()) {
            return mTabsId.get(position);
        }
        return null;
    }

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

    @Override
    public Fragment getItem(int position) {
        //TabInfo info = mTabs.get(position);
        return Fragment.instantiate(mContext, mTabs.get(position), new Bundle());
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        Log.i(TAG, "*******tab selected*******" +tab);
        clearDetails();
        if (mViewPager.getCurrentItem() != tab.getPosition()) {
            mViewPager.setCurrentItem(tab.getPosition(), true);
        }
    }

    @Override
    public void onPageSelected(int position) {
        mActionBar.setSelectedNavigationItem(position);
        if (mCurrentPosition == position) {          
        }
        mNextPosition = position;
    }

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

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

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

2 回答 2

3

这个页面

用户访问的每个页面的片段将保存在内存中,尽管它的视图层次结构在不可见时可能会被破坏。

这意味着用户不可见的片段仍保留在内存中,因此重新显示时不会调用它们的 onCreate 方法。您可以通过将 ViewPager 的离屏页面限制设置为 0来强制它们在切换页面时被踢出内存。

更好的方法可能是使用在 Fragment 之间共享的某种外部数据模型,然后使用 onPageSelected 方法告诉 Fragment 在进入视图时根据数据模型更新自身。

于 2013-03-06T07:29:45.197 回答
1

当您在Tab:(n)上时,只有Tab:(n-1)Tab:(n+1)会在内存中存活,以优化内存使用。休息所有选项卡将被销毁,这就是为什么当你回到第一个选项卡时,它onCreateView被再次调用。

实际上Tab:1即使onCreateView您单击Tab:2也会被调用,因为它是附近的 Tab。

我得到的一个解决方案是:

改变. OffscreenPageLimit_ ViewPager它的默认值为1

尝试将其更改为0. 应该可以。但是如果没有

使用回调

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

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

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
    }
于 2013-03-06T07:34:53.317 回答