21
21
22
22
package com .google .firebase .quickstart .analytics .java ;
23
23
24
- import android .annotation .SuppressLint ;
25
24
import android .content .DialogInterface ;
26
25
import android .content .Intent ;
27
26
import android .os .Bundle ;
28
27
import android .util .Log ;
29
28
import android .view .Menu ;
30
29
import android .view .MenuItem ;
31
-
30
+ import androidx . annotation . NonNull ;
32
31
import androidx .appcompat .app .AlertDialog ;
33
32
import androidx .appcompat .app .AppCompatActivity ;
34
33
import androidx .fragment .app .Fragment ;
35
34
import androidx .fragment .app .FragmentManager ;
36
- import androidx .fragment . app . FragmentPagerAdapter ;
35
+ import androidx .lifecycle . Lifecycle ;
37
36
import androidx .preference .PreferenceManager ;
38
37
import 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 ;
40
42
import com .google .firebase .analytics .FirebaseAnalytics ;
41
43
import com .google .firebase .quickstart .analytics .R ;
42
44
import com .google .firebase .quickstart .analytics .databinding .ActivityMainBinding ;
43
-
44
45
import java .util .Locale ;
45
46
46
47
/**
47
48
* Activity which displays numerous background images that may be viewed. These background images
48
49
* are shown via {@link ImageFragment}.
49
50
*/
50
51
public class MainActivity extends AppCompatActivity {
51
-
52
52
private static final String TAG = "MainActivity" ;
53
53
private static final String KEY_FAVORITE_FOOD = "favorite_food" ;
54
54
@@ -63,14 +63,14 @@ public class MainActivity extends AppCompatActivity {
63
63
64
64
/**
65
65
* 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.
67
67
*/
68
68
private ImagePagerAdapter mImagePagerAdapter ;
69
69
70
70
/**
71
71
* The {@link ViewPager} that will host the patterns.
72
72
*/
73
- private ViewPager mViewPager ;
73
+ private ViewPager2 mViewPager ;
74
74
75
75
/**
76
76
* The {@code FirebaseAnalytics} used to record screen views.
@@ -104,28 +104,31 @@ protected void onCreate(Bundle savedInstanceState) {
104
104
setUserFavoriteFood (userFavoriteFood );
105
105
}
106
106
107
-
108
107
// 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 () );
110
109
111
110
// Set up the ViewPager with the pattern adapter.
112
111
mViewPager = binding .viewPager ;
113
112
mViewPager .setAdapter (mImagePagerAdapter );
114
113
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 () {
122
115
@ Override
123
116
public void onPageSelected (int position ) {
117
+ super .onPageSelected (position );
124
118
recordImageView ();
125
119
recordScreenView ();
126
120
}
127
121
});
128
122
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
+
129
132
// Send initial screen screen view hit.
130
133
recordImageView ();
131
134
}
@@ -235,7 +238,7 @@ private String getCurrentImageId() {
235
238
236
239
/**
237
240
* Record a screen view for the visible {@link ImageFragment} displayed
238
- * inside {@link FragmentPagerAdapter }.
241
+ * inside {@link FragmentStateAdapter }.
239
242
*/
240
243
private void recordImageView () {
241
244
String id = getCurrentImageId ();
@@ -267,31 +270,18 @@ private void recordScreenView() {
267
270
}
268
271
269
272
/**
270
- * A {@link FragmentPagerAdapter } that returns a fragment corresponding to
273
+ * A {@link FragmentStateAdapter } that returns a fragment corresponding to
271
274
* one of the sections/tabs/pages.
272
275
*/
273
- public class ImagePagerAdapter extends FragmentPagerAdapter {
276
+ public class ImagePagerAdapter extends FragmentStateAdapter {
274
277
275
278
private final ImageInfo [] infos ;
276
279
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 );
280
282
this .infos = infos ;
281
283
}
282
284
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
295
285
public CharSequence getPageTitle (int position ) {
296
286
if (position < 0 || position >= infos .length ) {
297
287
return null ;
@@ -300,5 +290,17 @@ public CharSequence getPageTitle(int position) {
300
290
ImageInfo info = infos [position ];
301
291
return getString (info .title ).toUpperCase (l );
302
292
}
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
+ }
303
305
}
304
306
}
0 commit comments