102

メインビューでさまざまなフラグメントを開くタブが下部にあるフラグメントインターフェイスがあります。

アイテムのリストである特定のフラグメントが1つあります。ユーザーがこのリストのアイテムの1つを選択すると、別のフラグメントが開きます。このフラグメントには、前のフラグメントのリスト内のすべてのアイテム間を水平方向にスクロールするビューページャーが含まれています。これはうまくいきます。

ビューページャーはFragmentPagerAdapterを使用してアイテムを表示します。

問題は、ユーザーがリスト内のアイテムを選択して表示し、タブバーのボタンを押してリストに戻り、別のアイテムを選択した場合に発生します。2回目にアイテムを選択すると、ビューページャーの代わりに空白の画面が表示されます。これが発生しても、LogCatでエラーは発生しません。

ビューページャーが初めて表示されるのはなぜですか?

FragmentPagerAdapter:

public class ViewPagerAdapter extends FragmentPagerAdapter {
    Cursor mCursor;

    public ViewPagerAdapter(FragmentManager fm, Cursor c) {
        super(fm);
        mCursor = c;
    }

    public void changeCursor(Cursor c) {
        mCursor = c;
        this.notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        if (mCursor == null) return 0;
        else return mCursor.getCount();
    }

    @Override
    public Fragment getItem(int position) {
        mCursor.moveToPosition(position);
        return TeamCardFragment.newInstance(mCursor, position);
    }
}

PagerFragment:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Bundle bundle = getArguments();
    mCursorPosition = bundle.getInt(TeamCardCommon.BUNDLE_KEY_CURSOR_POSITION);

    View mView = inflater.inflate(R.layout.team_card_master, container, false);
    mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager);

    mAdapter = new ViewPagerAdapter(getFragmentManager(), cursor);
    new setAdapterTask().execute();

    return mView;
}

private class setAdapterTask extends AsyncTask<Void, Void, Void> {
    protected Void doInBackground(Void... params) {
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        mViewPager.setAdapter(mAdapter);
        mViewPager.setCurrentItem(mCursorPosition);
    }
}
4

14 に答える 14

223

私も同じ問題を抱えていました。「2回目」の表示の問題android.support.v4.app.FragmentPagerAdapterandroid.support.v4.app.FragmentStatePagerAdapter解決するために、PageAdapterの親クラスをから変更します。ViewPager

于 2011-12-12T17:01:12.930 に答える
89

親フラグメントgetFragmentManager()をに置き換えることで、これを解決することができました。getChildFragmentManager()この親フラグメントは、コンストラクターにフラグメントマネージャーを必要とするページング可能な(スライド可能な)フラグメントを含めるためにandroid.support.v4.app.FragmentPagerAdapterをインスタンス化していました。このコンストラクターに、の戻り値を渡しましたgetChildFragmentManager()

hackbodのリンクはキー(https://developer.android.com/about/versions/android-4.2.html#NestedFragments)でした。これは、この投稿のフラグメント内のフラグメントで見つかりました。

getChildFragmentManager()フラグメントをネストするには、フラグメントを追加するフラグメントを呼び出すだけです。これにより、フラグメントトランザクションを作成するためにトップレベルのアクティビティから通常行うように使用できるFragmentManagerが返されます。

于 2014-03-27T03:16:39.857 に答える
18

私の場合、ビューページャーでこれを呼び出す必要がありました。

myViewPager.setSaveFromParentEnabled(false);

ビューページャーが更新されず、フラグメントがあるはずの空白の白い画面しか表示されないという問題がありました。getChildFragmentManagerを渡していたのですが、役に立ちませんでした。

于 2017-07-12T04:11:30.720 に答える
11

AppBarLayoutとViewPagerでCoordinatorLayoutを使用していた非常に特殊なケースでは、AppBarLayout xmlプロパティからandroid:fitsSystemWindows="true"を削除することで解決しました。

理由を聞かないでください。少しばかげているように聞こえ、相関関係がないように聞こえますが、アダプターでgetChildFragmentManager()を既に使用していたため、この1行だけが問題を引き起こしていました。これを見つけるためだけにコードのデバッグに1日を費やしたので、他の誰かの時間を節約できることを願っています。

于 2016-07-22T00:36:46.383 に答える
10

アダプターをからに変更したのと同じ問題がありFragmentPagerAdapterFragmentStatePagerAdaptergetFragmentManager()フラグメント内でgetChildFragmentManager()

この背後にある理由はFragmentStatePagerAdapter、多数のページを格納するのに役立ち、訪問した各ページに関連付けられたメモリは、ページが表示されていない間、フラグメントの保存された状態のみを保持するため、少なくなります。これにより、フラグメントを切り替える際のオーバーヘッドが削減されます。

于 2017-08-16T16:33:55.643 に答える
4

親のViewPagersetOffscreenPageLimit (int limit)を装着してみてください。

mViewPager.setOffscreenPageLimit(totalPages-1);

これは私にとって魅力のように機能しました。

私の場合、内部にフラグメントがありTabLayoutましたViewPager.

そしてViewPager、そのフラグメント内の別の。初めてはすべて正常に動作しましたが、タブを変更して戻ったときに、フラグメントの一部が空白になりました。

于 2018-10-04T07:00:00.030 に答える
2

これはあなたを助けるでしょう。

    viewPager.setOffscreenPageLimit(position);
于 2018-08-21T07:27:27.397 に答える
1

これを回避するには、ビューページャーアイテムをフラグメントではなく標準ビューとして再実装し、それに応じてアダプターを変更します。

于 2011-11-29T19:24:38.700 に答える
1

Xamarin Androidで、2回目に空白の画面で同じ問題が発生していました。次の設定を行うと、問題が修正されました。

viewPager.SaveFromParentEnabled = false;
于 2017-09-03T07:03:37.947 に答える
1

class ViewPagerAdapter extends FragmentStatePagerAdapter this work for me this try this

于 2020-05-06T05:34:14.803 に答える
1

アダプタを呼び出すだけgetChildFragmentManager()です。その後、マルチクリックで空白になることはありません

于 2020-12-03T09:02:09.920 に答える
0

アプリが最小化されて後で呼び出されたときにこのエラーが発生した場合に備えて、アダプターを初期化することもできます。

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    Bundle bundle = getArguments();
    mCursorPosition = bundle.getInt(TeamCardCommon.BUNDLE_KEY_CURSOR_POSITION);
    View mView = inflater.inflate(R.layout.team_card_master, container, false);
    mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager);
    initViewPagerAdapter();
    return mView;
}
private void initViewPagerAdapter(){
    mAdapter = new ViewPagerAdapter(getFragmentManager(), cursor);
    new setAdapterTask().execute();
}

@Override
public void onResume(){
    super.onResume();
    initViewPagerAdapter();
}
于 2016-07-24T16:38:16.243 に答える
0

同じことがありました。2回目にPagerAdapterを呼び出すと、子ビューがNullPointerExceptionを返します。また、FragmentStatePagerAdapterでアダプターを変更すると、私の問題も解決します。

于 2017-08-04T02:00:28.017 に答える
0

代わりFragmentPagerAdapterFragmentStatePagerAdapter 使用に変更getChildFragmentManager()getFragmentManager()

getChildFragmentManager()-ドキュメントによると、このフラグメント内にフラグメントを配置および管理するためのプライベートFragmentManagerが返されるためです。一方getFragmentManager()、このアクティビティに関連付けられているフラグメントと対話するためにFragmentManagerを返します

于 2018-10-23T12:02:46.667 に答える