37

MarkMurphyによる「 TheBusyCodersGuide for Android Developers 」や、SOに関するこのような投稿などViewPagerFragment多くのソースで使用できない情報があります。私はそのような問題を抱えておらず、私の中でうまく使用しているので混乱しています。唯一の違いは、メソッドではなく、でインスタンス化することです。そして、すべてが完全に正常に機能します。ViewPagerFragmentViewPageronCreateView()onActivityCreated()

だから問題は-私は何かを知らないかもしれません、そしてこれは何らかの理由でUIのインスタンス化を行うために推奨されていませんonActivityCreated()か?しかし、繰り返しになりますが、すべてが正常に機能します。

クラスとxmlのリストは次のとおりです。

クラス:

public class ViewPagerFragment extends Fragment {

    static final int NUM_ITEMS = 2;

    private ViewPagerAdapter mAdapter;
    private ViewPager mPager;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.view_pager_fragment, container, false);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        mAdapter = new ViewPagerAdapter(getFragmentManager());

        mPager = (ViewPager) getView().findViewById(R.id.pager);
        mPager.setAdapter(mAdapter);
    }

    public static class ViewPagerAdapter extends FragmentPagerAdapter {
        public ViewPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int num) {
            if (num == 0) {
                return new ItemsListFragment();
            } else {
                return new FavsListFragment();
            }
        }

        @Override
        public int getCount() {
            return NUM_ITEMS;
        }
    }
}

レイアウト:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical">

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

</LinearLayout>
4

4 に答える 4

71

フラグメント内にビューページャーを実装するには、getFragmentManager()の代わりにgetChildFragmentManager()を使用します。onCreateView()またはonViewCreated()からViewPagerのsetAdapter()を呼び出すことができますが、これは問題ではありません。

これが皆さんのお役に立てば幸いです。

于 2014-10-30T13:39:24.300 に答える
62

更新:この回答は元々書かれていたので、ネストされたフラグメントを持つことができます。つまりViewPager、ページフラグメントを使用して、フラグメント自体に含めることができます。このサンプルプロジェクトは、この手法を示しています。

定期的に予定されている回答に戻り、全体を提示します...


本から自分を引用する:

ViewPagerを使用する最も簡単な方法は、ユーザーのスワイプに基づいて画面の内外にページフラグメントを配置することです。これは、ViewPager自体がフラグメント内に含まれていない場合にのみ機能します。これは、フラグメントを他のフラグメント内にネストすることはできないためです。

ダイアン・ハックボーンの引用:

ネストされたフラグメントは現在サポートされていません。別のフラグメントのUI内にフラグメントを配置しようとすると、未定義の動作が失敗する可能性があります。

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

私はこの本の次の版でこの点をより明確にするよう努めます(あなたが英国人でない限り、その場合、私はこの点をより明確にするよう努めます:-)。

于 2012-08-23T11:08:41.617 に答える
4

ViewPagerのSetionPageAdapterを初期化するときに、「getChildFragmentManager()」を使用します。

mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager());

于 2015-07-22T09:41:31.223 に答える
0

このコードを実行してview_pager_fragment.xmlを保存することは可能です

<android.support.design.widget.AppBarLayout
    android:id="@+id/appBarLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.design.widget.TabLayout
        android:id="@+id/tab"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</android.support.design.widget.AppBarLayout>

<android.support.v4.view.ViewPager
    android:id="@+id/viewpager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />

ViewPagerFragment

ViewPager viewPager;
TabLayout tabLayout;

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

    viewPager = (ViewPager) view.findViewById(R.id.viewpager);
    tabLayout = (TabLayout) view.findViewById(R.id.tab);

    return view;
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    setupViewPager(viewPager);
    tabLayout.setupWithViewPager(viewPager);

    tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });
}

private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getChildFragmentManager());``


    viewPager.setAdapter(viewPagerAdapter);
}

public class ViewPagerAdapter extends FragmentStatePagerAdapter {
    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        if(position == 0) return new SampleFragment();
        if(position == 1) return new SampleFragment2();
        if(position == 2) return new SampleFragment3();
        throw new IllegalStateException("Unexpected position " + position);
    }

    @Override
    public int getCount() {
        return 3;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        if(position == 0) return "Tab 1";
        if(position == 1) return "Tab 2";
        if(position == 2) return "Tab 3";
        throw new IllegalStateException("Unexpected position " + position);
    }
}
于 2017-05-30T10:23:09.450 に答える