首页 文章

onCreateView没有调用操作栏中的选项卡TabsAdapter选择了第二次选项卡吗?

提问于
浏览
1

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

当我选择任何选项卡时,相关片段的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) {          
    }

2 回答

  • 1

    来自this page

    用户访问的每个页面的片段将保留在内存中,但其视图层次结构可能会在不可见时被销毁 .

    这意味着用户看不到的片段仍然保留在内存中,因此重新显示了他们的onCreate方法't be called when they' . 通过将ViewPager的offscreen page limit设置为0,可以在切换页面时强制它们被踢出内存 .

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

  • 3

    当你在 Tab:(n) 时,只有 Tab:(n-1)Tab:(n+1) 将在内存中存活,以便进行内存使用优化 . 休息所有标签都将被销毁,这就是为什么当你回到第一个标签时,它的 onCreateView 再次被调用 .

    实际上 Tab:1onCreateView 将被调用,即使你单击 Tab:2 因为它的邻居Tab .

    One solution i got is:

    更改 ViewPagerOffscreenPageLimit . 它的默认值是 1

    尝试将其更改为 0 . 应该工作 . 但万一如果没有

    Use the Call backs

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

相关问题