3

隣り合った 2 つのフラグメントを含むレイアウトのアクティビティがあります。各 Fragment には、ViewPager があります。両方の Fragment を同じように表示する必要があるため、ViewPager を含む同じレイアウト XML を両方に使用します。

アプリをテストすると、最初の Fragment の ViewPager だけが機能するようです。2 番目の Fragment には PagerTitleStrip が表示され、ページをめくることができますが、ViewPager に Fragment が表示されません。

2 番目の ViewPager にも Fragments が表示されないのはなぜですか? これは何が原因ですか?彼らが同じレイアウトを使用しているという問題はありますか?とにかく別のオブジェクトではありませんか?

アクティビティ内の 2 つのフラグメントが共有するレイアウトは次のようになります。

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.v4.view.PagerTitleStrip
        android:id="@+id/search_mapping_pager_title_strip"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:background="#33b5e5"
        android:paddingBottom="4dp"
        android:paddingTop="4dp"
        android:textColor="#fff" />

</android.support.v4.view.ViewPager>

どちらの Fragment も同じ方法で ViewPager をインスタンス化します。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_search_mapping,
            container, false);

    mSectionsPagerAdapter = new SectionsPagerAdapter(mActivity
            .getSupportFragmentManager());
    mViewPager = (ViewPager) view.findViewById(R.id.pager);
    mViewPager.setAdapter(mSectionsPagerAdapter);

    return view;
}

編集:私のを示すより多くのコードSectionsPagerAdapter:

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = new SuperclassFragment();
        Bundle args = new Bundle();
        args.putInt(SuperclassFragment.ARG_SECTION_NUMBER, position + 1);
        fragment.setArguments(args);
        return fragment;
    }

    ...

}

バグの原因を探すヒントはありますか? もちろん、必要に応じてここにさらにコードを含めることもできます。

4

3 に答える 3

1

FragmentPagerAdapter は、ViewPager id/Page Item id の組み合わせに依存して、ページ アイテムをインスタンス化する必要があるかどうかを確認します (FragmentPagerAdapter.instantiateItem 関数を参照してください)。ViewPager をフラグメントに配置すると、View Pager の両方のインスタンスが同じ ID を持つことになり、ページ位置がページのデフォルト ID であるため、2 番目の ViewPager のページがインスタンス化されることはありません。

回避策は、プログラムで ViewPager id を設定する
viewPager.setId(myID++);
か、アダプターで getItemId をオーバーライドして、ViewPager ごとに項目 ID が異なるようにすることです。

于 2016-02-08T02:32:02.423 に答える
0

Fragment のレイアウト内に ViewPager を配置することで、フラグメント内に子フラグメントを追加しようとしています。ネストされたフラグメントは 4.2 以降でのみサポートされ、サポート ライブラリにも追加されました。

View Pager をフラグメント内でサポートするには、独自のバージョンの PagerAdapter を実装する必要があります。SO投稿の1つから、

ViewPager のコンテンツ自体にフラグメントが含まれていない限り、ViewPager を Fragment 内に配置することは完全に可能です。Android サポート パッケージによって提供される PagerAdapter の具体的な実装はフラグメントを使用するため、独自のフラグメントのない PagerAdapter をロールして、ViewPager をフラグメントに配置する必要があります。

以下は、問題と考えられる解決策を説明するいくつかの投稿です

Fragment 内で ViewPager を使用できないのはなぜですか? それは実際にある

ViewPager 内のフラグメントの問題

于 2013-04-04T05:25:49.820 に答える