Fixed
Status Update
Comments
jg...@google.com <jg...@google.com> #2
since these are in public API (:/) we need to do this in 1.2
jg...@google.com <jg...@google.com> #3
since it is already marked as deprecated, we can probably do it by now.
an...@gmail.com <an...@gmail.com> #4
Opening diff shortly
an...@gmail.com <an...@gmail.com> #5
Project: platform/frameworks/support
Branch: androidx-master-dev
commit d576cbdc911cba16638a44fd8223391a90a07ef7
Author: Mike Nakhimovich <digitalbuddha@users.noreply.github.com>
Date: Tue Aug 11 09:30:34 2020
[GH] Hide deprecated internal API.
## Proposed Changes
* `RoomDatabase.java` has protected `mCallbacks` field which is leaking in the API docs, we should @Hide it.
## Testing
Test: Ran unit tests locally
## Issues Fixed
Fixes: 76109329
This is an imported pull request fromhttps://github.com/androidx/androidx/pull/61 .
Resolves #61
Github-Pr-Head-Sha: 6440daa3a63752c7f9d5ba2a390248cd85bc634f
GitOrigin-RevId: fe92d8466a59b44b218b6ca3cbd57dcda17992f7
Change-Id: Id599cdf5b02b32bdae0166266fb7da967598fe92
A room/runtime/api/current.ignore
M room/runtime/api/current.txt
M room/runtime/api/public_plus_experimental_current.txt
M room/runtime/api/restricted_current.txt
M room/runtime/src/main/java/androidx/room/RoomDatabase.java
https://android-review.googlesource.com/1396827
Branch: androidx-master-dev
commit d576cbdc911cba16638a44fd8223391a90a07ef7
Author: Mike Nakhimovich <digitalbuddha@users.noreply.github.com>
Date: Tue Aug 11 09:30:34 2020
[GH] Hide deprecated internal API.
## Proposed Changes
* `RoomDatabase.java` has protected `mCallbacks` field which is leaking in the API docs, we should @Hide it.
## Testing
Test: Ran unit tests locally
## Issues Fixed
Fixes: 76109329
This is an imported pull request from
Resolves #61
Github-Pr-Head-Sha: 6440daa3a63752c7f9d5ba2a390248cd85bc634f
GitOrigin-RevId: fe92d8466a59b44b218b6ca3cbd57dcda17992f7
Change-Id: Id599cdf5b02b32bdae0166266fb7da967598fe92
A room/runtime/api/current.ignore
M room/runtime/api/current.txt
M room/runtime/api/public_plus_experimental_current.txt
M room/runtime/api/restricted_current.txt
M room/runtime/src/main/java/androidx/room/RoomDatabase.java
jg...@google.com <jg...@google.com>
jg...@google.com <jg...@google.com> #6
We've filed a bug on Navigation.
In the meantime, as a workaround, instead of creating a NavHostFragment directly as a page, create a regular Fragment subclass instance with a container inside it, and place NavHostFragment inside that container.
Container can be something simple, e.g. a FrameLayout with an id, e.g. generated by ViewCompat.generateId()
In the meantime, as a workaround, instead of creating a NavHostFragment directly as a page, create a regular Fragment subclass instance with a container inside it, and place NavHostFragment inside that container.
Container can be something simple, e.g. a FrameLayout with an id, e.g. generated by ViewCompat.generateId()
il...@google.com <il...@google.com> #7
Note that the id on your FrameLayout should *not* use ViewCompat.generateId() as the ID needs to be stable across configuration changes. The issue filed against Navigation (https://issuetracker.google.com/issues/139421197 ) has been fixed for the upcoming Navigation 2.2.0-alpha02 - when using that version of Navigation, you wouldn't have to make any modifications to your ViewPager2 adapter and it would work with any version of ViewPager2.
Description
Would like to use an existing app layout and take benefit of offscreen screen "caching"
The issue
Currently if I attempt to use NavHostFragment in combination with ViewPager2 and FragmentStateAdapter I'll get the following runtime exception due to uninitialised containterViewId (stack trace below).
If I change FragmentStateAdapter.placeFragmentInViewHolder
From:
// { f:notAdded, v:notCreated, v:notAttached } -> add, create, attach
if (!shouldDelayFragmentTransactions()) {
scheduleViewAttach(fragment, container);
mFragmentManager.beginTransaction().add(fragment, "f" + holder.getItemId()).commitNow();
}
To:
// { f:notAdded, v:notCreated, v:notAttached } -> add, create, attach
if (!shouldDelayFragmentTransactions()) {
mFragmentManager.beginTransaction().add(container.getId(), fragment, "f" + holder.getItemId()).commitNow();
}
The issue is solved. Testing a couple of scenarios did not reveal any side effects, but as I have yet to familiarise myself with the details of the implementation I'm not sure if it will not have any negative side effects.
Happy to put up a PR for this, but would like to understand better why the fragment is being added this way in the current state of the adapter.
Stack trace:
java.lang.IllegalArgumentException: Must use non-zero containerViewId
at androidx.fragment.app.FragmentTransaction.replace(FragmentTransaction.java:223)
at androidx.fragment.app.FragmentTransaction.replace(FragmentTransaction.java:200)
at androidx.navigation.fragment.FragmentNavigator.navigate(FragmentNavigator.java:181)
at androidx.navigation.fragment.FragmentNavigator.navigate(FragmentNavigator.java:58)
at androidx.navigation.NavGraphNavigator.navigate(NavGraphNavigator.java:80)
at androidx.navigation.NavGraphNavigator.navigate(NavGraphNavigator.java:30)
at androidx.navigation.NavController.navigate(NavController.java:877)
at androidx.navigation.NavController.onGraphCreated(NavController.java:524)
at androidx.navigation.NavController.setGraph(NavController.java:482)
at androidx.navigation.NavController.setGraph(NavController.java:447)
at androidx.navigation.fragment.NavHostFragment.onCreate(NavHostFragment.java:248)
at androidx.fragment.app.Fragment.performCreate(Fragment.java:2613)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:831)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1228)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1293)
at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2066)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1856)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1811)
at androidx.fragment.app.FragmentManagerImpl.execSingleAction(FragmentManagerImpl.java:1686)
at androidx.fragment.app.BackStackRecord.commitNow(BackStackRecord.java:293)
at androidx.viewpager2.adapter.FragmentStateAdapter.placeFragmentInViewHolder(FragmentStateAdapter.java:284)
at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:222)
at androidx.viewpager2.adapter.FragmentStateAdapter.onViewAttachedToWindow(FragmentStateAdapter.java:61)
at androidx.recyclerview.widget.RecyclerView.dispatchChildAttached(RecyclerView.java:7433)
at androidx.recyclerview.widget.RecyclerView$5.addView(RecyclerView.java:862)
at androidx.recyclerview.widget.ChildHelper.addView(ChildHelper.java:107)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:8478)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8436)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8424)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1641)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4040)
at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3757)
at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4310)