1

SlidingMenu、Action Bar Sherlock を使用するアプリがあり、Android 4.2 のリリースでサポート ライブラリに導入されたネストされたフラグメントを使用するように以前のコードを書き直そうとしています。

問題は、フラグメントをスワイプすると、フラグメントが一瞬表示されてから消えることです (黒い画面)。画面に表示されたままになることもあれば、画面が完全に黒くなり、フラグメントがまったく表示されないこともあります。フラグメントのライフサイクルについての理解が不足していると思われますが、実際にはここでエラーを確認できません。

それらをスワイプすると、さまざまな結果が得られます。初期ロードでは、最初のフラグメントは黒です。nr 4 にスワイプして nr 1 に戻ると、nr 1 フラグメントは問題ありません。nr 2 にすばやくスワイプしてから nr 1 にスワイプすると、nr 1 が再び黒くなります。nr 2 から nr 1 にゆっくりとスワイプすると、nr 1 は問題ありません:-/

これが私のコードです:

public class LeagueInfoFragment extends SherlockFragment {
...
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    if (container != null) {
        container.removeAllViews();
    }
    setRetainInstance(true);
    setHasOptionsMenu(true);
    mExampleId = getArguments().getInt("mExampleId");

    View view = inflater.inflate(R.layout.viewpager_tournament, container,
            false);
    ViewPager awesomePager = (ViewPager) view.findViewById(R.id.pager);
    awesomePager.setAdapter(new ExamplePagerAdapter(this, getChildFragmentManager(), createFragments()));

    TabPageIndicator titleIndicator = (TabPageIndicator) view
            .findViewById(R.id.titles);
    titleIndicator.setViewPager(awesomePager);

    return view;
}

private List<Fragment> createFragments() {
        List<Fragment> list = new ArrayList<Fragment>();
        list.add(LeagueTableFragment.newInstance(0));
        list.add(FixturesFragment.newInstance(1));
        list.add(NewsFragment.newInstance(2));
        list.add(TopscorerFragment.newInstance(3));
        return list;    
}

private class ExamplePagerAdapter extends FragmentPagerAdapter {
    String[] pages;

    LeagueInfoFragment _activity;
    List<Fragment> fragments;
    private ExamplePagerAdapter(LeagueInfoFragment a,
            FragmentManager fragManager, List<Fragment> frags) {
        super(fragManager);
        this.fragments = frags;
        _activity = a;
        pages = new String[] { _activity.getString(R.string.table),
                _activity.getString(R.string.fixtures),
                _activity.getString(R.string.news),
                _activity.getString(R.string.top_scorers) };
    }

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

    @Override
    public Fragment getItem(int arg0) {
        return fragments.get(arg0);         
    }

    public String getPageTitle(int position) {
        return pages[position];
    }
}

そして、これが私のフラグメントの1つです(ここに投稿されたコードを減らすために簡略化されています):

public class NewsFragment extends SherlockFragment implements IAsynchData
{   
public static NewsFragment newInstance(int notUsed) {
    NewsFragment f = new NewsFragment();
    return f;
}

@Override
public View onCreateView(android.view.LayoutInflater inflater,
    ViewGroup container, Bundle savedInstanceState) {
    if (container != null) {
        container.removeAllViews();
    }
    View view = inflater.inflate(R.layout.fragment_news, container,
            false);
            //Code left out to load the URL in the webview
    updateRssFeed("http://www.sportspage.com/myteam");
    return view;
}   

}

4

1 に答える 1

2

申し訳ありませんが、 FragmentのonCreateViewでこれを行うのはなぜですか:

if (container != null) {
        container.removeAllViews();
}

私が知っているように、現時点では、コンテナーViewPagerであり、removeAllViews () - ViewPager で作成された Fragments のすべてビュー削除します。

于 2012-11-17T20:09:22.503 に答える