向后导航时,NestedScrollView未保存片段滚动说明

时间:2019-07-18 11:34:51

标签: android android-fragments android-navigation android-nestedscrollview android-architecture-navigation

我的应用程序使用单一活动架构,该活动架构在活动布局中具有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)

1 个答案:

答案 0 :(得分:1)

NestedScrollView已将导航容器包装在activity_main布局中。因此,保存滚动状态的是活动。有3个片段。主页片段的高度固定,Leaderboard和Register片段正在滚动。当您在排行榜或注册中滚动并切换到另一滚动条时,滚动状态不会改变(因为两者都可以滚动到大致相同的高度),但是如果切换到主片段,滚动状态会重置,因为它具有固定的高度(屏幕)。当我检查它时,用ScrollView替换NestedScrollView并没有任何改变。 我认为正确的设计是使用NestedScrollView包装每个片段,并为每个片段设置并获取滚动状态。 导航组件不会将片段添加到活动状态,而是将其替换。因此,通过在片段之间切换可以重新创建片段。这样您就可以看到滚动状态正在重置。您可以通过在第一个片段的onCreateView中放置一些日志来自己检查它,然后查看该日志出现两次。