webentwicklung-frage-antwort-db.com.de

Warum ist es nicht möglich, ViewPager innerhalb eines Fragments zu verwenden? Es ist tatsächlich so

Es gibt Informationen, dass es nicht möglich ist, ViewPager innerhalb einer Fragment in vielen Quellen wie " The Busy Coders Guide for Android Developers " von Mark Murphy oder Posts wie this on SO zu verwenden. Ich bin verwirrt, weil ich ein solches Problem nicht habe und erfolgreich ViewPager in meiner Fragment verwende. Der einzige Unterschied besteht darin, dass ich eine ViewPager nicht in onCreateView()-Methode, sondern in onActivityCreated() instanziiere. Und alles funktioniert perfekt. 

Die Frage ist also - vielleicht weiß ich einfach nichts und das wird aus irgendeinem Grund nicht empfohlen, um UI-Instantiierungen in onActivityCreated() zu machen. Aber wieder - alles funktioniert gut.

Hier ist die Auflistung der Klasse und XML:

Klasse:

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;
        }
    }
}

Layout:

<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>
36
Eugene

UPDATE: Da diese Antwort ursprünglich geschrieben wurde, können Sie jetzt geschachtelte Fragmente haben. Dies bedeutet, dass es möglich ist, dass eine ViewPager Fragmente für die Seiten und in einem Fragment selbst verwendet wird. Dieses Beispielprojekt demonstriert die Technik.

Ich kehre nun zu Ihrer regelmäßig geplanten Antwort zurück, die in ihrer Gesamtheit präsentiert wird ...


Ich zitiere mich aus dem Buch:

Die einfachste Möglichkeit, einen ViewPager zu verwenden, besteht darin, dass er Seitenfragmente in und aus dem .__ einfügt. Bildschirm basierend auf Benutzereinsätzen. Dies funktioniert nur, wenn der ViewPager selbst nicht enthalten ist innerhalb eines Fragments, da Fragmente nicht in andere Fragmente geschachtelt werden können.

Zitat Dianne Hackborn

Geschachtelte Fragmente werden derzeit nicht unterstützt. Wenn Sie versuchen, ein Fragment in die Benutzeroberfläche eines anderen Fragments einzufügen, führt dies zu undefiniertem und wahrscheinlich fehlerhaftem Verhalten.

Es ist durchaus möglich, eine ViewPager in eine Fragment zu setzen, solange der Inhalt der ViewPagerselbst nicht Fragmente enthält. Da die konkreten Implementierungen von PagerAdapter, die vom Android Support-Paket bereitgestellt werden, Fragmente verwenden, müssen Sie Ihre eigene fragmentlose PagerAdapter rollen, um die ViewPager in ein Fragment zu setzen.

Ich werde mich bemühen, diesen Punkt in der nächsten Ausgabe des Buches klarer zu machen (es sei denn, Sie sind Brite. In diesem Fall werde ich versuchen, diesen Punkt klarer zu machen :-).

61
CommonsWare

Um den View-Pager in einem Fragment zu implementieren, verwenden Sie getChildFragmentManager () anstelle von getFragmentManager () . Sie können setAdapter () für den ViewPager von onCreateView () oder onActivityCreated () aufrufen, das ist keine Frage.

Ich hoffe, das wird euch helfen.

69
Rajkumar

Beim Initialisieren des SetionPageAdapter für ViewPager verwenden Sie "getChildFragmentManager ()".

mSectionsPagerAdapter = new SectionsPagerAdapter (getChildFragmentManager ());

4
hims_3009

versuchen Sie diesen Code und speichern Sie 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());``

    viewPagerAdapter.addFragment(new FirstFragment(), "First");
    viewPagerAdapter.addFragment(new SecoundFragment(), "Secound");
    viewPagerAdapter.addFragment(new LoginFragment(), "Login");

    viewPager.setAdapter(viewPagerAdapter);
}

private class ViewPagerAdapter extends FragmentPagerAdapter {

    List<Fragment> fragmentList = new ArrayList<>();
    List<String> fragmentTitles = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager fragmentManager) {
        super(fragmentManager);
    }

    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

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

    @Override
    public CharSequence getPageTitle(int position) {
        return fragmentTitles.get(position);
    }

    public void addFragment(Fragment fragment, String name) {
        fragmentList.add(fragment);
        fragmentTitles.add(name);
    }
}
0
mukesh mali