Fixed
Status Update
Comments
jg...@google.com <jg...@google.com> #2
Nested scrolling works partially (as per http://b/122818889 ). Let's discuss if we need full support and if so make sure it works.
jg...@google.com <jg...@google.com> #3
Hi!
What is 'partially' exactly?
How do I see it?
Thanks!
What is 'partially' exactly?
How do I see it?
Thanks!
an...@gmail.com <an...@gmail.com> #4
As of now:
- Nesting scroll views with a scroll direction perpendicular to the ViewPager2's orientation inside ViewPager2 works
- Nesting scroll views with a scroll direction parallel to the ViewPager2's orientation inside ViewPager2 does not work
- Nesting scroll views with a scroll direction perpendicular to the ViewPager2's orientation inside ViewPager2 works
- Nesting scroll views with a scroll direction parallel to the ViewPager2's orientation inside ViewPager2 does not work
an...@gmail.com <an...@gmail.com> #5
Horizontal ViewPager2 not correctly working into a vertical RecyclerView
Set a setNestedScrollingEnabled to the RecyclerView into the ViewPager2 (across reflection) resolves the problem
Set a setNestedScrollingEnabled to the RecyclerView into the ViewPager2 (across reflection) resolves the problem
jg...@google.com <jg...@google.com>
jg...@google.com <jg...@google.com> #6
ageevvalentin@gmail.com, could you provide a sample app? I'd like to learn more about the circumstances that cause the problem; putting a clean ViewPager2 inside a clean RecyclerView seems to work fine, so there must be other factors involved.
il...@google.com <il...@google.com> #7
Added a patch for androidx-master-dev that demos a horizontal ViewPager2 inside a vertical RecyclerView.
Verified that it works correctly on a:
- Nexus 4 emulator with API 17
- Nexus 5X emulator with API 28
- Pixel 2 device with API 29
To reproduce:
- Check out the Android Jetpack source (at commit 256899f482ff85cddfb050f37550be7b5ec927ef) (see steps in [1])
- Apply the patch (`git apply 0001-Add-sample-where-a-horizontal-ViewPager2-is-nested-i.patch`)
- Build and install viewpager2's integration-tests app: `./gradlew viewpager2:integration-tests:testapp:installDebug`
- Run it
Closing the issue for now, but please reopen if you have a minimal reproduction app
[1]https://android.googlesource.com/platform/frameworks/support/+/256899f482ff85cddfb050f37550be7b5ec927ef
Verified that it works correctly on a:
- Nexus 4 emulator with API 17
- Nexus 5X emulator with API 28
- Pixel 2 device with API 29
To reproduce:
- Check out the Android Jetpack source (at commit 256899f482ff85cddfb050f37550be7b5ec927ef) (see steps in [1])
- Apply the patch (`git apply 0001-Add-sample-where-a-horizontal-ViewPager2-is-nested-i.patch`)
- Build and install viewpager2's integration-tests app: `./gradlew viewpager2:integration-tests:testapp:installDebug`
- Run it
Closing the issue for now, but please reopen if you have a minimal reproduction app
[1]
jg...@google.com <jg...@google.com> #8
Re-opening as requested by a few users. Narrowed down the focus to nested scrolling elements with the same scroll direction.
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)