Status Update
Comments
ma...@gmail.com <ma...@gmail.com> #2
I feel like this is a serious issue that should get more attention. When working with RecyclerViews you had the possibility of setting up if a ViewHolder is able the be recycled.
All the solutions to circumvent this problem here are either hacks in regards to how the Keyboard is opened, or you ditch LazyColumn completely and use a Column, which is not a solution for complex layouts.
ap...@google.com <ap...@google.com> #4
and cause the other focusable element could not access touch
il...@google.com <il...@google.com> #5
We should have some API to pin an item to indicate that we want to keep it around and not dispose it.
Please don't make this API internal, make it public for everyone to use and also allow this API to be used with any kind of items inside of LazyLayout's (not only focusable items). I have described why I need it in this issue
ma...@gmail.com <ma...@gmail.com> #6
Related in spirit:
STOP MAKING ALL USEFUL APIS INTERNAL
il...@google.com <il...@google.com> #7
This issue is also relevant to text selection, where selection should be able to cross items of a LazyColumn
(wrapped in a SelectionContainer
). Items with a selection inside should not be removed from the composition, but the handles disappear when the first element containing any selected text is scrolled out of view. See attached video for illustration.
Although, sometimes it is desired behaviour. Maybe add a flag whether to persist the node?
an...@google.com <an...@google.com> #8
rc...@olx.ph <rc...@olx.ph> #9
il...@google.com <il...@google.com> #10
rc...@olx.ph <rc...@olx.ph> #11
ja...@gmail.com <ja...@gmail.com> #12
il...@google.com <il...@google.com> #13
Any update?
ja...@gmail.com <ja...@gmail.com> #14
Any update?
ja...@gmail.com <ja...@gmail.com> #15
Branch: androidx-main
commit 36abe1718e16025253df6f22cd786fc034447be5
Author: Andrey Kulikov <andreykulikov@google.com>
Date: Wed Nov 16 19:27:22 2022
Add items pinning functionality to the lazy lists
Lazy lists now provide an instance of PinnableContainer via LocalPinnableContainer for each item. It allows to pin the current item from inside the content of the item. Pinning means we will continue composing, measuring and placing this item even when it is scrolled away from the view. Note that the placed position is not guaranteed to be the real one as we do not compose the items in between the pinned one and the first/last visible one.
This interface was added to the ui module as conceptually PinnableContainer is decoupled from lazy layouts from the foundation module. Other layouts using SubcomposeLayout could have some similar functionality and may want to support pinning. And it will allow for modifiers from ui to use this interface to pin their content.
Test: LazyListPinnableContentTest
Fixes: 259274257
Fixes: 195049010
Relnote: Introduced PinnableContainer api propagated by lazy lists via a composition local which allows to pin current item. This means such item will not be disposed when it is scrolled away from the view. For example, Modifier.focusable() will pin the current focused item via this mechanism.
Change-Id: Ib8881191a529c9d9dc5e886570650b1987763207
M compose/foundation/foundation/api/current.ignore
M compose/foundation/foundation/api/current.txt
M compose/foundation/foundation/api/public_plus_experimental_current.txt
M compose/foundation/foundation/api/restricted_current.ignore
M compose/foundation/foundation/api/restricted_current.txt
M compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/FocusableTest.kt
D compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/layout/PinnableParentTest.kt
M compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListBeyondBoundsItemCountTest.kt
A compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListPinnableContainerTest.kt
D compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListPinningTest.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Focusable.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListItemProvider.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
A compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListPinnableContainerProvider.kt
D compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListPinningModifier.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridItemProvider.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/LazyLayoutItemProvider.kt
D compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/layout/PinnableParent.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridItemProvider.kt
M compose/ui/ui/api/current.txt
M compose/ui/ui/api/public_plus_experimental_current.txt
M compose/ui/ui/api/restricted_current.txt
A compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/PinnableContainer.kt
M tv/tv-foundation/api/current.txt
M tv/tv-foundation/api/public_plus_experimental_current.txt
M tv/tv-foundation/api/restricted_current.txt
A tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/list/LazyListPinnableContainerTest.kt
D tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/LazyListPinningModifier.kt
M tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/grid/LazyGridItemProvider.kt
M tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/LazyBeyondBoundsModifier.kt
M tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/LazyList.kt
M tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/LazyListBeyondBoundsInfo.kt
M tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/LazyListItemProvider.kt
M tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/LazyListMeasure.kt
A tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/LazyListPinnableContainerProvider.kt
M tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/LazyListState.kt
Description
Version used: 2.2.0-rc03
Devices/Android versions reproduced on: can't reproduce
I have a few crash reports about this exceptions, that I can't reproduce in normal conditions and I wonder if this is some corner-case bug.
Stacktrace:
Fatal Exception: java.lang.IllegalStateException: unknown destination during deep link: com.app:id/nav_graph_main
at androidx.navigation.NavController.handleDeepLink(NavController.java:660)
at androidx.navigation.NavController.onGraphCreated(NavController.java:573)
at androidx.navigation.NavController.setGraph(NavController.java:534)
at androidx.navigation.NavController.setGraph(NavController.java:514)
at com.app.view.HomeFragment.prepareNestedNavHost(HomeFragment.java:65)
at com.app.view.HomeFragment.onViewCreated(HomeFragment.java:50)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:304)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1227)
at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2373)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2108)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2064)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1960)
at androidx.fragment.app.FragmentManager$4.run(FragmentManager.java:418)
I have a main NavHostFragment, hosted in my MainActivity, that owns the "nav_graph_main" graph.
HomeFragment is a destination of "nav_graph_main" and it contains a second NavHost (the "nested" NavHost) to manage navigation between several subscreens together with a BottomNavigationBar (HomeFragment's layout is a NavHostFragment above a BottomNavigatonBar).
The graph of the "nested" navigation ("nav_graph_home") is a separate resource, with no link to the outer "nav_graph_main" graph.
I need to programmatically set the nested graph to the nested NavController, because the start destination practically depends on which bottom navigation tab I want to be selected first.
Therefore, in HomeFragment's onViewCreated, I call the following prepareNestedNavHost:
fun prepareNestedNavHost() {
val startDestination = args.startDestination
val navHostFragment = childFragmentManager.findFragmentById(R.id.navHostHome) as? NavHostFragment
navHostFragment?.navController?.apply {
// I have no other way to know if the graph is not set:
kotlin.runCatching { this.graph }.onFailure {
val nestedGraph = navInflater.inflate(R.navigation.nav_graph_home)
graph.startDestination = startDestination
this.graph = nestedGraph
}
}
}
The only potential reason that came out of my mind is that the nested NavController, sharing the same Activity with the outer NavController, might end up handling an Intent directed to the latter. Is this working as intended?