Sådan bruges ViewPager til at navigere mellem fragmenter (med TabLayout)

At lave fragmenter Rul pænt

ViewPager er en layoutmanager, der giver brugeren mulighed for at rulle til venstre og højre for at navigere gennem flere fragmenter med en glidende animation. En adapter håndterer alle transaktioner mellem forskellige fragmenter. Denne måde behøver FragmentTransaction.replace () ikke at blive kaldt hver gang brugeren ruller. Efter selvstudiet er der et par tip til at undgå almindelige fejl og forbedre brugeroplevelsen, hvis din kode ikke fungerer som forventet. Du kan finde kildekoden til dette projekt her.

Trin 1: Sæt en ViewPager-widget i dit xml-layout. Jeg satte widgetten i Activity_main.xml og tildelte dens id at være view_pager.

Trin 2: Opsæt de barnefragmenter, du gerne vil vise. Jeg lavede 3 børnefragmenter, kaldte dem ChildFragment1, ChildFragment2 og ChildFragment3. Husk at få dem til at udvide support.v4.app.fragment. Lav nu layouts til alle tre fragmenter. Jeg kalder dem child_fragment_1_layout, child_fragment_2_layout og child_fragment_3_layout. For enkelheds skyld vil jeg sætte en knap i hvert layout (med henholdsvis id-knap_1, knap_2 og knap_3) og få dem til at lave en skål, når de klikkes. Overstyr metoden onCreateView (), og oppust layouterne. Træk knapperne op for at få vist en anden toast.

3 forskellige børnefragmenter (erstattes med dine egne fragmenter)3 layouts for hvert barn fragment (erstattes med dine egne layouts)

Trin 3: Lav en adapter til ViewPager. Du bliver nødt til at udvide entenFragmentPagerAdapter eller FragmentStatePagerAdapter. Til denne tutorial bruger vi FragmentPagerAdapter. Forskellen mellem de to kan findes her. Efter at have udvidet FragmentPagerAdapter, skal du kalde super (FragmentManager) i din konstruktør og implementere metoderne getItem (position) og getCount (). Metoden getItem (position) bruges til at returnere fragmentet i den tilsvarende position, bestilt fra venstre mod højre. Så ChildFragment1 ville være på position 0, ChildFragment2 ville være på position 1, og ChildFragment3 ville være på position 2. Metoden getCount () er at tælle, hvor mange fragmenter der er at vise, og i dette tilfælde er der 3.

Trin 4: Find nu din ViewPager i MainActivity, og ring metoden setAdapter (), og send den i din tilpassede adapter. Hvis du gør dette i et andet fragment (nestede fragmenter), bliver du nødt til at videregive getChildFragmentManager () i argumentet om din adapter i stedet. Nu er din ViewPager klar!

Brug af ViewPager med TabLayout

Trin 5: Du kan vise faner med ViewPager virkelig let. (Du kan også bruge ViewPagerTitleStrip og ViewPagerTabStrip.) Medtag en TabLayout i din Activity_main.xml. Jeg giver det en id tab_layout. Husk at ændre begrænsningen på din ViewPager, så det ikke blokerer TabLayout.

Trin 6: Gå til MainActivity og find TabLayout. Ring derefter til setupWithViewPager (), og indtast din ViewPager som argumentet.

Trin 7: Gå til sidst til din adapter og skift titlen på hvert fragment. Tilsidesæt metoden getPageTitle ().

Resultatet skal se sådan ud:

Undgå fejl og forbedre brugeroplevelsen

Spørgsmål: Hvorfor opstår der en undtagelse, da jeg forsøgte at ændre noget i 3. fragment fra 1. fragment?
A: Som standard indlæser ViewPager kun de tilstødende fragmenter (en til venstre og en til højre), og hvis du forsøgte at ændre de uindlæste fragmenter, vil der være en fejl.

Sp .: Under rulle inden for ViewPager bemærkede jeg en lille mængde inputforsinkelse, og nogle gange dukker Visninger pludselig ind på siden i stedet for at glide over. Hvad kan jeg gøre?
A: Der er 2 grunde til, at dette kan forekomme. Først bruger du muligvis for mange fragmenter i din FragmentPagerAdapter. Overvej at bruge en FragmentStatePagerAdapter i stedet. Det er en bedre mulighed, hvis der er et stort antal børnefragmenter. For det andet indlæser du sandsynligvis for mange visninger i dit fragment. Der er 3 måder at løse dette problem på. Først kan du indlæse indholdet i Visningerne, når ViewPager er inaktiv. Du kan lytte til den ændring med ViewPager.OnPageChangeListener. For det andet kan du øge standardmængden af ​​sider, der er indlæst med ViewPager.setOffScreenPageLimit () -metoden. Endelig skal du altid bruge en RecyclerView i stedet for en ListView i dit barnesnit, fordi det genbruger celler, når brugeren ruller op og ned.