1

フラグメントと ActionBarSherlock で構築されたタブ付きアプリケーションがあります。3 つのタブがあり、3 つの ListFragment があります。

任意のタブを選択すると、関連するフラグメントの onCreate メソッドが最初は期待どおりに呼び出されますが、2 番目には呼び出されません。問題は、次の隣接するタブに対して onCreate メソッドが呼び出されますが、選択されたタブではありません。

tab2 をクリックすると、tab3 の onCreate が呼び出されますが、tab2 は呼び出されません。

実際、私の要件は、tab1 のデータを変更するとフラグメント 1 を意味することです。これらの変更は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に設定することにより、ページを切り替えるときにそれらを強制的にメモリから追い出すことができます。

より良い方法は、フラグメント間で共有されるある種の外部データモデルを使用してから、onPageSelectedメソッドを使用して、表示されたときにデータモデルに基づいてフラグメント自体を更新するようにフラグメントに指示することです。

于 2013-03-06T07:29:45.197 に答える
1

Tab:(n)を使用している場合、メモリ使用量の最適化のために、Tab:(n-1)Tab:(n+1)のみがメモリ内で有効になります。残りのすべてのタブは破棄されます。これが、最初のタブに戻ったときにonCreateView再度呼び出される理由です。

実際にはTab:2をクリックしてもTab:1が呼び出されます。これは隣接するタブであるためです。onCreateView

私が得た1つの解決策は次のとおりです。

の を変更し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 に答える