Fixed
Status Update
Comments
ap...@google.com <ap...@google.com> #2
Hi Ed, Thank you so much for these suggestions. I've been reviewing them and merging them in. Hopefully it should be live. I've included a thank you note too in the article.
ap...@google.com <ap...@google.com> #3
Great! Thanks a lot, I'll look for the live updates soon!
ap...@google.com <ap...@google.com> #4
Project: platform/frameworks/support
Branch: androidx-master-dev
commit a24863fab1958f10c3791f0dbf612862c972be21
Author: jbwoods <jbwoods@google.com>
Date: Wed Apr 17 10:09:32 2019
Save fragment maxState on save and restore
Added mMaxState to fragmentState.
Test: Added test and reran Fragment tests
BUG: 129780800
Change-Id: Ibbe023668043e82078aa7fd97e0fd233457972f8
M fragment/src/androidTest/java/androidx/fragment/app/SaveStateFragmentTest.kt
M fragment/src/main/java/androidx/fragment/app/FragmentState.java
https://android-review.googlesource.com/946700
https://goto.google.com/android-sha1/a24863fab1958f10c3791f0dbf612862c972be21
Branch: androidx-master-dev
commit a24863fab1958f10c3791f0dbf612862c972be21
Author: jbwoods <jbwoods@google.com>
Date: Wed Apr 17 10:09:32 2019
Save fragment maxState on save and restore
Added mMaxState to fragmentState.
Test: Added test and reran Fragment tests
BUG: 129780800
Change-Id: Ibbe023668043e82078aa7fd97e0fd233457972f8
M fragment/src/androidTest/java/androidx/fragment/app/SaveStateFragmentTest.kt
M fragment/src/main/java/androidx/fragment/app/FragmentState.java
ap...@google.com <ap...@google.com> #5
Project: platform/frameworks/support
Branch: androidx-master-dev
commit c37223a1b4512f1d34e100d2e521062dbad028d7
Author: jbwoods <jbwoods@google.com>
Date: Tue Apr 16 13:39:38 2019
Deprecate setUserVisibleHint()
We the addition of the setMaxLifecycle() Api in FragmentTransactions,
setUserVisibleHint() can be deprecated.
Deprecate setUserVisibleHint() method in fragments and marking all
usages (only used in FragmentPagerAdapter and
FragmentStatePagerAdapter) with SuppressWarnings("deprecated").
Test: ran Fragment Test
./gradlew checkApi
BUG: 129780800
Change-Id: I3d99991eb33dfc65d4b79efe566b54d0adce9d68
M fragment/api/1.1.0-alpha07.txt
M fragment/api/current.txt
M fragment/src/androidTest/java/androidx/fragment/app/NestedInflatedFragmentTest.kt
M fragment/src/androidTest/java/androidx/fragment/app/SaveStateFragmentTest.kt
M fragment/src/main/java/androidx/fragment/app/Fragment.java
M fragment/src/main/java/androidx/fragment/app/FragmentPagerAdapter.java
M fragment/src/main/java/androidx/fragment/app/FragmentStatePagerAdapter.java
https://android-review.googlesource.com/945776
https://goto.google.com/android-sha1/c37223a1b4512f1d34e100d2e521062dbad028d7
Branch: androidx-master-dev
commit c37223a1b4512f1d34e100d2e521062dbad028d7
Author: jbwoods <jbwoods@google.com>
Date: Tue Apr 16 13:39:38 2019
Deprecate setUserVisibleHint()
We the addition of the setMaxLifecycle() Api in FragmentTransactions,
setUserVisibleHint() can be deprecated.
Deprecate setUserVisibleHint() method in fragments and marking all
usages (only used in FragmentPagerAdapter and
FragmentStatePagerAdapter) with SuppressWarnings("deprecated").
Test: ran Fragment Test
./gradlew checkApi
BUG: 129780800
Change-Id: I3d99991eb33dfc65d4b79efe566b54d0adce9d68
M fragment/api/1.1.0-alpha07.txt
M fragment/api/current.txt
M fragment/src/androidTest/java/androidx/fragment/app/NestedInflatedFragmentTest.kt
M fragment/src/androidTest/java/androidx/fragment/app/SaveStateFragmentTest.kt
M fragment/src/main/java/androidx/fragment/app/Fragment.java
M fragment/src/main/java/androidx/fragment/app/FragmentPagerAdapter.java
M fragment/src/main/java/androidx/fragment/app/FragmentStatePagerAdapter.java
ap...@google.com <ap...@google.com> #6
Project: platform/frameworks/support
Branch: androidx-master-dev
commit 27bacd7294b8bcb312fadeb155724ebf9ac99e16
Author: jbwoods <jbwoods@google.com>
Date: Thu Apr 18 10:16:21 2019
Change max lifecycle state in FragmentState to ordinal
Saving the max lifecycle state as an int instead of a String.
Also renamed mLifecycleState to mMaxLifecycleState.
Test: all test pass
BUG: 129780800
Change-Id: Id8e3cf5acfee491f0fe6dae1799b83fbbff49635
M fragment/src/main/java/androidx/fragment/app/FragmentState.java
https://android-review.googlesource.com/947817
https://goto.google.com/android-sha1/27bacd7294b8bcb312fadeb155724ebf9ac99e16
Branch: androidx-master-dev
commit 27bacd7294b8bcb312fadeb155724ebf9ac99e16
Author: jbwoods <jbwoods@google.com>
Date: Thu Apr 18 10:16:21 2019
Change max lifecycle state in FragmentState to ordinal
Saving the max lifecycle state as an int instead of a String.
Also renamed mLifecycleState to mMaxLifecycleState.
Test: all test pass
BUG: 129780800
Change-Id: Id8e3cf5acfee491f0fe6dae1799b83fbbff49635
M fragment/src/main/java/androidx/fragment/app/FragmentState.java
ap...@google.com <ap...@google.com> #7
Project: platform/frameworks/support
Branch: androidx-master-dev
commit c727857cf258f06d003c42417f37c75a4139b369
Author: jbwoods <jbwoods@google.com>
Date: Wed Apr 17 02:15:03 2019
Add constructors for new opt-in FragmentPagerAdapter behavior
FragmentPagerAdapter can make use of the setMaxLifecycle()
FragmentTransaction Api to ensure that only the fragment currently
visible to the user is resumed.
The default behavior places all fragments in a resumed state. This gives
developers the option to pass a boolean in to take advantage of the new
behavior.
Test: Ran supportv7 app
./gradlew checkApi
BUG: 129780800
Change-Id: Idbd97b4ebe0c22ac588340ef3b4369c7c5f4a1bd
M fragment/api/1.1.0-alpha07.txt
M fragment/api/current.txt
M fragment/src/main/java/androidx/fragment/app/BackStackRecord.java
M fragment/src/main/java/androidx/fragment/app/BackStackState.java
M fragment/src/main/java/androidx/fragment/app/FragmentPagerAdapter.java
M fragment/src/main/java/androidx/fragment/app/FragmentStatePagerAdapter.java
M fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java
M samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java
https://android-review.googlesource.com/945787
https://goto.google.com/android-sha1/c727857cf258f06d003c42417f37c75a4139b369
Branch: androidx-master-dev
commit c727857cf258f06d003c42417f37c75a4139b369
Author: jbwoods <jbwoods@google.com>
Date: Wed Apr 17 02:15:03 2019
Add constructors for new opt-in FragmentPagerAdapter behavior
FragmentPagerAdapter can make use of the setMaxLifecycle()
FragmentTransaction Api to ensure that only the fragment currently
visible to the user is resumed.
The default behavior places all fragments in a resumed state. This gives
developers the option to pass a boolean in to take advantage of the new
behavior.
Test: Ran supportv7 app
./gradlew checkApi
BUG: 129780800
Change-Id: Idbd97b4ebe0c22ac588340ef3b4369c7c5f4a1bd
M fragment/api/1.1.0-alpha07.txt
M fragment/api/current.txt
M fragment/src/main/java/androidx/fragment/app/BackStackRecord.java
M fragment/src/main/java/androidx/fragment/app/BackStackState.java
M fragment/src/main/java/androidx/fragment/app/FragmentPagerAdapter.java
M fragment/src/main/java/androidx/fragment/app/FragmentStatePagerAdapter.java
M fragment/src/main/java/androidx/fragment/app/FragmentTransaction.java
M samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java
ap...@google.com <ap...@google.com> #8
Project: platform/frameworks/support
Branch: androidx-master-dev
commit 55a7eabab4c4b81efaf146626a34e5014fd8081c
Author: jbwoods <jbwoods@google.com>
Date: Thu Apr 18 13:18:18 2019
Change max lifecycle state in BackStackState to ordinal
Saving the max lifecycle state as an int array instead of an array list
of strings.
Also renamed mLifecycleStates to mMaxLifecycleStates
Test: all test pass
BUG: 129780800
Change-Id: Ie91d4b6fd22f202cfcc0847791643821808deb78
M fragment/src/androidTest/java/androidx/fragment/app/BackStackStateTest.kt
M fragment/src/main/java/androidx/fragment/app/BackStackState.java
https://android-review.googlesource.com/947562
https://goto.google.com/android-sha1/55a7eabab4c4b81efaf146626a34e5014fd8081c
Branch: androidx-master-dev
commit 55a7eabab4c4b81efaf146626a34e5014fd8081c
Author: jbwoods <jbwoods@google.com>
Date: Thu Apr 18 13:18:18 2019
Change max lifecycle state in BackStackState to ordinal
Saving the max lifecycle state as an int array instead of an array list
of strings.
Also renamed mLifecycleStates to mMaxLifecycleStates
Test: all test pass
BUG: 129780800
Change-Id: Ie91d4b6fd22f202cfcc0847791643821808deb78
M fragment/src/androidTest/java/androidx/fragment/app/BackStackStateTest.kt
M fragment/src/main/java/androidx/fragment/app/BackStackState.java
ap...@google.com <ap...@google.com> #9
Project: platform/frameworks/support
Branch: androidx-master-dev
commit ee8763ef15a9aeb37e9b5afed55a1e8b05c2ad55
Author: jbwoods <jbwoods@google.com>
Date: Fri Apr 19 15:13:20 2019
SetUserVisibleHint on current PrimaryItem instead of new one
setUserVisibleHint() was being called on the wrong fragment. It was
being called on the fragment that would no longer be the primary.
Test: Ran in support v7
BUG: 129780800
Change-Id: I79c4e907a3ad1c747f6c865951ef15943c5d20ce
M fragment/src/main/java/androidx/fragment/app/FragmentPagerAdapter.java
M fragment/src/main/java/androidx/fragment/app/FragmentStatePagerAdapter.java
https://android-review.googlesource.com/948717
https://goto.google.com/android-sha1/ee8763ef15a9aeb37e9b5afed55a1e8b05c2ad55
Branch: androidx-master-dev
commit ee8763ef15a9aeb37e9b5afed55a1e8b05c2ad55
Author: jbwoods <jbwoods@google.com>
Date: Fri Apr 19 15:13:20 2019
SetUserVisibleHint on current PrimaryItem instead of new one
setUserVisibleHint() was being called on the wrong fragment. It was
being called on the fragment that would no longer be the primary.
Test: Ran in support v7
BUG: 129780800
Change-Id: I79c4e907a3ad1c747f6c865951ef15943c5d20ce
M fragment/src/main/java/androidx/fragment/app/FragmentPagerAdapter.java
M fragment/src/main/java/androidx/fragment/app/FragmentStatePagerAdapter.java
ap...@google.com <ap...@google.com> #10
Project: platform/frameworks/support
Branch: androidx-master-dev
commit a3a06d11f42afb5d4f891a71046d49fcca387576
Author: jbwoods <jbwoods@google.com>
Date: Mon Apr 22 15:21:06 2019
Use IntDef instead of boolean in FragmentPagerAdapter
Deprecated the orignal constructors for FragmentPagerAdapter and
FragmentStatePagerAdapter to encourage developers to use the new
constructor that allows the behavior of only allowing the current
fragment to be in a RESUMED state.
Changed the new constructor to take an IntDef instead of a boolean so
that the intended behavior is clear. Passing in
USE_SET_USER_VISIBLE_HINT uses the old behavior and passing
RESUME_ONLY_CURRENT_FRAGMENT uses the new behavior.
Test: support v4 demo, support v7 demo, ./gradlew checkApi
BUG: 129780800
Change-Id: Ie2fcf318424fd4037ff6c541ba5a6e901c97fc5b
M fragment/api/1.1.0-alpha07.txt
M fragment/api/current.txt
M fragment/src/main/java/androidx/fragment/app/FragmentPagerAdapter.java
M fragment/src/main/java/androidx/fragment/app/FragmentStatePagerAdapter.java
M samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentPagerSupport.java
M samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentStatePagerSupport.java
M samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java
https://android-review.googlesource.com/948733
https://goto.google.com/android-sha1/a3a06d11f42afb5d4f891a71046d49fcca387576
Branch: androidx-master-dev
commit a3a06d11f42afb5d4f891a71046d49fcca387576
Author: jbwoods <jbwoods@google.com>
Date: Mon Apr 22 15:21:06 2019
Use IntDef instead of boolean in FragmentPagerAdapter
Deprecated the orignal constructors for FragmentPagerAdapter and
FragmentStatePagerAdapter to encourage developers to use the new
constructor that allows the behavior of only allowing the current
fragment to be in a RESUMED state.
Changed the new constructor to take an IntDef instead of a boolean so
that the intended behavior is clear. Passing in
USE_SET_USER_VISIBLE_HINT uses the old behavior and passing
RESUME_ONLY_CURRENT_FRAGMENT uses the new behavior.
Test: support v4 demo, support v7 demo, ./gradlew checkApi
BUG: 129780800
Change-Id: Ie2fcf318424fd4037ff6c541ba5a6e901c97fc5b
M fragment/api/1.1.0-alpha07.txt
M fragment/api/current.txt
M fragment/src/main/java/androidx/fragment/app/FragmentPagerAdapter.java
M fragment/src/main/java/androidx/fragment/app/FragmentStatePagerAdapter.java
M samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentPagerSupport.java
M samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentStatePagerSupport.java
M samples/Support7Demos/src/main/java/com/example/android/supportv7/app/ToolbarFragmentPagerMenu.java
ap...@google.com <ap...@google.com> #11
Project: platform/frameworks/support
Branch: androidx-master-dev
commit f78c4e5094bcc35546c177e2360e90b0b6316ed9
Author: jbwoods <jbwoods@google.com>
Date: Mon Apr 22 15:32:10 2019
Call setMaxLifecycle() after add() in FragmentStatePagerAdapter
SetMaxLifecycle() must be called after add() or an
IllegalArgumentException will be called because the fragment is not yet
attached to the FragmentManager.
In instantiateItem(), if used, the call the setUserVisibleHint() will still
happen before the fragment is added. If only the current fragment is resumed,
setMaxLifecycle() will be called after add().
Test: support v4 app
BUG: 129780800
Change-Id: Ic3406fcb83554ba94e270f8cffd8acacf3a2da4f
M fragment/src/main/java/androidx/fragment/app/FragmentStatePagerAdapter.java
M samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentStatePagerSupport.java
https://android-review.googlesource.com/948732
https://goto.google.com/android-sha1/f78c4e5094bcc35546c177e2360e90b0b6316ed9
Branch: androidx-master-dev
commit f78c4e5094bcc35546c177e2360e90b0b6316ed9
Author: jbwoods <jbwoods@google.com>
Date: Mon Apr 22 15:32:10 2019
Call setMaxLifecycle() after add() in FragmentStatePagerAdapter
SetMaxLifecycle() must be called after add() or an
IllegalArgumentException will be called because the fragment is not yet
attached to the FragmentManager.
In instantiateItem(), if used, the call the setUserVisibleHint() will still
happen before the fragment is added. If only the current fragment is resumed,
setMaxLifecycle() will be called after add().
Test: support v4 app
BUG: 129780800
Change-Id: Ic3406fcb83554ba94e270f8cffd8acacf3a2da4f
M fragment/src/main/java/androidx/fragment/app/FragmentStatePagerAdapter.java
M samples/Support4Demos/src/main/java/com/example/android/supportv4/app/FragmentStatePagerSupport.java
jb...@google.com <jb...@google.com> #12
This has been added internally and will be available in Fragments 1.0.0-alpha07.
zh...@gmail.com <zh...@gmail.com> #14
While you're at it, can you rename `getItem(int position)` to `createFragment(int position)`? It's a very common source of bugs.
ma...@gmail.com <ma...@gmail.com> #15
Shouldn't non-visible fragments also be stopped, not just paused?
Fragment docs mention that fragment is started when it is visible to the user. If fragment is completely hidden, then it should be stopped, right?
Fragment docs mention that fragment is started when it is visible to the user. If fragment is completely hidden, then it should be stopped, right?
il...@google.com <il...@google.com> #16
Re #15 - that is not possible for FragmentPagerAdapter/FragmentStatePagerAdapter since ViewPager supports margins (i.e., the offscreen pages *are* partially visible), among other complications.
In a non-ViewPager context, setMaxLifecycle() certainly supports stopping Fragments.
In a non-ViewPager context, setMaxLifecycle() certainly supports stopping Fragments.
wy...@gmail.com <wy...@gmail.com> #17
I use FragmentVPAdapter with 4 fragments, and there are their life logs, two of them had called onResume , but fragment2 called onPause after onResume:
onAttach 1
onCreate 1
onAttach 2
onCreate 2
onCreateView 1
onActivityCreated 1
onStart 1
onResume 1
onPause 1
onCreateView 2
onActivityCreated 2
onStart 2
onResume 2
onPause 2
onResume 1
```
mViewpager = findViewById(R.id.viewpager)
val adapter = FragmentVPAdapter(supportFragmentManager,RESUME_ONLY_CURRENT_FRAGMENT)
mViewpager.adapter = adapter
class FragmentVPAdapter(
fragmentManager: FragmentManager, @Behavior behavior: Int
) : FragmentStatePagerAdapter(
fragmentManager, behavior
) {
val fragments = listOf<Fragment>(
MyFragment.newInstance(1),
MyFragment.newInstance(2),
MyFragment.newInstance(3),
MyFragment.newInstance(4)
)
override fun getItem(position: Int): Fragment {
return fragments[position]
}
override fun getCount(): Int {
return fragments.size
}
}
onAttach 1
onCreate 1
onAttach 2
onCreate 2
onCreateView 1
onActivityCreated 1
onStart 1
onResume 1
onPause 1
onCreateView 2
onActivityCreated 2
onStart 2
onResume 2
onPause 2
onResume 1
```
mViewpager = findViewById(R.id.viewpager)
val adapter = FragmentVPAdapter(supportFragmentManager,RESUME_ONLY_CURRENT_FRAGMENT)
mViewpager.adapter = adapter
class FragmentVPAdapter(
fragmentManager: FragmentManager, @Behavior behavior: Int
) : FragmentStatePagerAdapter(
fragmentManager, behavior
) {
val fragments = listOf<Fragment>(
MyFragment.newInstance(1),
MyFragment.newInstance(2),
MyFragment.newInstance(3),
MyFragment.newInstance(4)
)
override fun getItem(position: Int): Fragment {
return fragments[position]
}
override fun getCount(): Int {
return fragments.size
}
}
il...@google.com <il...@google.com> #18
Re #17 - please file new issues, rather than tacking issues onto already closed issues. In your case, I believe your issue is already covered by https://issuetracker.google.com/issues/131557151
Description
Version used: 1.1.0-alpha05
There's a number of cases where Fragments should be capped at a lower Lifecycle than the FragmentManager/Activity. For example, off screen pages of a ViewPager shouldn't be resumed.
Ideally, this would be something you could do as part of a FragmentTransaction via an API like:
supportFragmentManager.beginTransaction()
.setMaxLifecycle(fragment, Lifecycle.State.STARTED)
.commit()
Setting the max lifecycle back to Lifecycle.State.RESUMED would effectively remove the restriction (since that's the highest lifecycle state).
This should allow the deprecation of the setUserVisibleHint() API.