2121
2222package com .google .firebase .quickstart .analytics .java ;
2323
24- import android .annotation .SuppressLint ;
2524import android .content .DialogInterface ;
2625import android .content .Intent ;
2726import android .os .Bundle ;
2827import android .util .Log ;
2928import android .view .Menu ;
3029import android .view .MenuItem ;
31-
30+ import androidx . annotation . NonNull ;
3231import androidx .appcompat .app .AlertDialog ;
3332import androidx .appcompat .app .AppCompatActivity ;
3433import androidx .fragment .app .Fragment ;
3534import androidx .fragment .app .FragmentManager ;
36- import androidx .fragment . app . FragmentPagerAdapter ;
35+ import androidx .lifecycle . Lifecycle ;
3736import androidx .preference .PreferenceManager ;
3837import androidx .viewpager .widget .ViewPager ;
39-
38+ import androidx .viewpager2 .adapter .FragmentStateAdapter ;
39+ import androidx .viewpager2 .widget .ViewPager2 ;
40+ import com .google .android .material .tabs .TabLayout ;
41+ import com .google .android .material .tabs .TabLayoutMediator ;
4042import com .google .firebase .analytics .FirebaseAnalytics ;
4143import com .google .firebase .quickstart .analytics .R ;
4244import com .google .firebase .quickstart .analytics .databinding .ActivityMainBinding ;
43-
4445import java .util .Locale ;
4546
4647/**
4748 * Activity which displays numerous background images that may be viewed. These background images
4849 * are shown via {@link ImageFragment}.
4950 */
5051public class MainActivity extends AppCompatActivity {
51-
5252 private static final String TAG = "MainActivity" ;
5353 private static final String KEY_FAVORITE_FOOD = "favorite_food" ;
5454
@@ -63,14 +63,14 @@ public class MainActivity extends AppCompatActivity {
6363
6464 /**
6565 * The {@link androidx.viewpager.widget.PagerAdapter} that will provide fragments for each image.
66- * This uses a {@link FragmentPagerAdapter }, which keeps every loaded fragment in memory.
66+ * This uses a {@link FragmentStateAdapter }, which keeps every loaded fragment in memory.
6767 */
6868 private ImagePagerAdapter mImagePagerAdapter ;
6969
7070 /**
7171 * The {@link ViewPager} that will host the patterns.
7272 */
73- private ViewPager mViewPager ;
73+ private ViewPager2 mViewPager ;
7474
7575 /**
7676 * The {@code FirebaseAnalytics} used to record screen views.
@@ -104,28 +104,31 @@ protected void onCreate(Bundle savedInstanceState) {
104104 setUserFavoriteFood (userFavoriteFood );
105105 }
106106
107-
108107 // Create the adapter that will return a fragment for each image.
109- mImagePagerAdapter = new ImagePagerAdapter (getSupportFragmentManager (), IMAGE_INFOS );
108+ mImagePagerAdapter = new ImagePagerAdapter (getSupportFragmentManager (), IMAGE_INFOS , getLifecycle () );
110109
111110 // Set up the ViewPager with the pattern adapter.
112111 mViewPager = binding .viewPager ;
113112 mViewPager .setAdapter (mImagePagerAdapter );
114113
115- // Workaround for AppCompat issue not showing ViewPager titles
116- ViewPager .LayoutParams params = (ViewPager .LayoutParams )
117- binding .pagerTabStrip .getLayoutParams ();
118- params .isDecor = true ;
119-
120- // When the visible image changes, send a screen view hit.
121- mViewPager .addOnPageChangeListener (new ViewPager .SimpleOnPageChangeListener () {
114+ mViewPager .registerOnPageChangeCallback (new ViewPager2 .OnPageChangeCallback () {
122115 @ Override
123116 public void onPageSelected (int position ) {
117+ super .onPageSelected (position );
124118 recordImageView ();
125119 recordScreenView ();
126120 }
127121 });
128122
123+ TabLayout tabLayout = binding .tabLayout ;
124+
125+ // When the visible image changes, send a screen view hit.
126+ new TabLayoutMediator (tabLayout , mViewPager , new TabLayoutMediator .TabConfigurationStrategy () {
127+ public void onConfigureTab (@ NonNull TabLayout .Tab tab , int position ) {
128+ tab .setText (IMAGE_INFOS [position ].title );
129+ }
130+ }).attach ();
131+
129132 // Send initial screen screen view hit.
130133 recordImageView ();
131134 }
@@ -235,7 +238,7 @@ private String getCurrentImageId() {
235238
236239 /**
237240 * Record a screen view for the visible {@link ImageFragment} displayed
238- * inside {@link FragmentPagerAdapter }.
241+ * inside {@link FragmentStateAdapter }.
239242 */
240243 private void recordImageView () {
241244 String id = getCurrentImageId ();
@@ -267,31 +270,18 @@ private void recordScreenView() {
267270 }
268271
269272 /**
270- * A {@link FragmentPagerAdapter } that returns a fragment corresponding to
273+ * A {@link FragmentStateAdapter } that returns a fragment corresponding to
271274 * one of the sections/tabs/pages.
272275 */
273- public class ImagePagerAdapter extends FragmentPagerAdapter {
276+ public class ImagePagerAdapter extends FragmentStateAdapter {
274277
275278 private final ImageInfo [] infos ;
276279
277- @ SuppressLint ("WrongConstant" )
278- public ImagePagerAdapter (FragmentManager fm , ImageInfo [] infos ) {
279- super (fm , BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT );
280+ public ImagePagerAdapter (FragmentManager fm , ImageInfo [] infos , Lifecycle lifecyle ) {
281+ super (fm , lifecyle );
280282 this .infos = infos ;
281283 }
282284
283- @ Override
284- public Fragment getItem (int position ) {
285- ImageInfo info = infos [position ];
286- return ImageFragment .newInstance (info .image );
287- }
288-
289- @ Override
290- public int getCount () {
291- return infos .length ;
292- }
293-
294- @ Override
295285 public CharSequence getPageTitle (int position ) {
296286 if (position < 0 || position >= infos .length ) {
297287 return null ;
@@ -300,5 +290,17 @@ public CharSequence getPageTitle(int position) {
300290 ImageInfo info = infos [position ];
301291 return getString (info .title ).toUpperCase (l );
302292 }
293+
294+ @ NonNull
295+ @ Override
296+ public Fragment createFragment (int position ) {
297+ ImageInfo info = infos [position ];
298+ return ImageFragment .newInstance (info .image );
299+ }
300+
301+ @ Override
302+ public int getItemCount () {
303+ return infos .length ;
304+ }
303305 }
304306}
0 commit comments