Android如何让HorizontalScrollView固定在Toolbar下方无需回顶切换Fragment
解决方案
布局调整逻辑
你当前的HorizontalScrollView被嵌套在NestedScrollView内部,所以会跟随页面整体滚动,要实现固定吸附在Toolbar下方,只需要调整布局层级,将HorizontalScrollView移出NestedScrollView,作为ConstraintLayout的直接子View固定在Toolbar下方即可。
修改后完整布局代码
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/smoky_white" tools:context=".o_kaznau"> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@color/purple_200" android:elevation="4dp" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:title="О КазНАИУ" /> <!-- 移出NestedScrollView,固定在Toolbar下方 --> <HorizontalScrollView android:id="@+id/horizontalScrollView" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@id/toolbar" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <Button android:id="@+id/btnAbout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/about_btn" android:onClick="aboutAbout" android:textSize="15sp" android:textAllCaps="false" android:text="Об университете" /> <Button android:id="@+id/btnRyk" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/about_btn" android:onClick="aboutRyc" android:textSize="15sp" android:textAllCaps="false" android:text="Руководство" /> <Button android:id="@+id/btnPolitika" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/about_btn" android:onClick="aboutPolitika" android:textSize="15sp" android:textAllCaps="false" android:text="Политика" /> <Button android:id="@+id/button5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/about_btn" android:onClick="aboutYstav" android:textSize="15sp" android:textAllCaps="false" android:text="Устав" /> </LinearLayout> </HorizontalScrollView> <androidx.core.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/horizontalScrollView"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <ImageView android:id="@+id/imageView11" android:layout_width="match_parent" android:layout_height="230dp" android:scaleType="fitXY" android:src="@drawable/im_maincorpus1"/> <FrameLayout android:id="@+id/aboutFL" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout> </androidx.core.widget.NestedScrollView> </androidx.constraintlayout.widget.ConstraintLayout>
额外适配注意事项
因为你第2、4个Fragment里有承载大量数据的RecyclerView,需要做滑动兼容处理:
- 在对应Fragment的RecyclerView布局中添加属性
android:nestedScrollingEnabled="false",避免和外层NestedScrollView产生滑动冲突,保证列表滚动流畅、数据正常渲染。 - 如果需要RecyclerView独立滑动,可以把FrameLayout移出NestedScrollView,单独约束在HorizontalScrollView底部,同时去掉外层NestedScrollView,由Fragment内部的RecyclerView处理滑动逻辑,性能更好。
内容的提问来源于stack exchange,提问作者IBlackVikingl
相关产品推荐
相关产品推荐

