我的应用程序使用单一活动架构,该活动架构在活动布局中具有NestedScrollView
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.android.navigationadvancedsample.MainActivity">
<androidx.core.widget.NestedScrollView
android:id="@+id/app_scroll_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:fillViewport="true">
<FrameLayout
android:id="@+id/nav_host_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
</androidx.core.widget.NestedScrollView>
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_nav"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:menu="@menu/bottom_nav"/>
</LinearLayout>
我的问题是,当我滚动一个片段,然后导航到另一个片段,然后返回时,滚动位置将重置。我看到了另一个答案,该答案表明在布局中添加ID应该可以解决此问题,但这对我而言不是。另外,有趣的是,滚动位置在配置更改时可以很好地保存。
我正在使用NavigationComponents,这可能相关吗? Here's a sample project再现了问题(基于Google的NavigationAdvancedSample)
答案 0 :(得分:1)
NestedScrollView已将导航容器包装在activity_main布局中。因此,保存滚动状态的是活动。有3个片段。主页片段的高度固定,Leaderboard和Register片段正在滚动。当您在排行榜或注册中滚动并切换到另一滚动条时,滚动状态不会改变(因为两者都可以滚动到大致相同的高度),但是如果切换到主片段,滚动状态会重置,因为它具有固定的高度(屏幕)。当我检查它时,用ScrollView替换NestedScrollView并没有任何改变。 我认为正确的设计是使用NestedScrollView包装每个片段,并为每个片段设置并获取滚动状态。 导航组件不会将片段添加到活动状态,而是将其替换。因此,通过在片段之间切换可以重新创建片段。这样您就可以看到滚动状态正在重置。您可以通过在第一个片段的onCreateView中放置一些日志来自己检查它,然后查看该日志出现两次。