Android中ScrollView仅作用于TextView而非整个布局的解决求助
解决ScrollView整页滚动而非仅TextView内部滚动的问题
嘿,我来帮你搞定这个滚动问题!你现在遇到的情况是因为几个布局设置的小问题导致ScrollView没发挥整页滚动的作用,反而让txtDescricaoLocal自己内部滚动了。咱们一步步来改:
问题根源分析
txtDescricaoLocal设置了固定高度:你给它设了android:layout_height="49dp",当内容超过这个高度时,它就会自己内部滚动,而不是让整个页面跟着ScrollView滚动。- 冗余的ConstraintLayout属性:你的根布局是RelativeLayout,但很多控件加了
app:layout_constraintXXX这类ConstraintLayout的约束属性,这些属性在RelativeLayout里是无效的,会干扰布局的正常计算。 - 布局定位逻辑冲突:部分控件用了
layout_above和负margin(比如android:layout_marginBottom="-31dp"),导致布局重叠或高度计算异常,ScrollView无法正确识别整个页面的内容高度。
解决方案
按照下面的修改来调整你的布局:
- 把
txtDescricaoLocal的高度改成wrap_content,让它根据内容自动适配高度 - 移除所有RelativeLayout控件上的
app:layout_constraintXXX属性 - 调整控件的布局依赖,用
layout_below来依次排列控件,避免用layout_above和负margin - 确保BottomNavigationView固定在页面底部,不影响其他内容的滚动空间
修改后的完整布局代码
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <!-- ViewPager 顶部轮播 --> <android.support.v4.view.ViewPager android:id="@+id/viewPagerLocal" android:layout_width="344dp" android:layout_height="178dp" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="27dp" /> <!-- 收藏星标 --> <ImageView android:id="@+id/estrelaIndicaFavorito" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@+id/viewPagerLocal" android:layout_alignEnd="@+id/viewPagerLocal" android:tint="@android:color/holo_orange_light" app:srcCompat="@drawable/ic_star_black_24dp" tools:ignore="VectorDrawableCompat" /> <!-- 联系标题 --> <TextView android:id="@+id/textContactos" android:layout_width="90dp" android:layout_height="29dp" android:layout_alignLeft="@+id/viewPagerLocal" android:layout_below="@+id/viewPagerLocal" android:text="@string/Contactos" android:textColor="@android:color/black" android:textSize="18sp" /> <!-- 联系内容 --> <com.uncopt.android.widget.text.justify.JustifiedTextView android:id="@+id/txtContactosLocal" android:layout_width="330dp" android:layout_height="wrap_content" android:layout_alignLeft="@id/viewPagerLocal" android:layout_below="@+id/textContactos" android:layout_marginTop="8dp" /> <!-- 营业时间标题 --> <TextView android:id="@+id/textHorarios" android:layout_width="90dp" android:layout_height="29dp" android:layout_alignLeft="@+id/viewPagerLocal" android:layout_below="@+id/txtContactosLocal" android:layout_marginTop="16dp" android:text="@string/horarios" android:textColor="@android:color/black" android:textSize="18sp" /> <!-- 营业时间内容 --> <com.uncopt.android.widget.text.justify.JustifiedTextView android:id="@+id/txtHorariosLocal" android:layout_width="330dp" android:layout_height="wrap_content" android:layout_alignLeft="@id/viewPagerLocal" android:layout_below="@id/textHorarios" android:layout_marginTop="8dp" /> <!-- 描述标题 --> <TextView android:id="@+id/descricao" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/txtHorariosLocal" android:layout_centerHorizontal="true" android:layout_marginTop="16dp" android:gravity="center" android:text="@string/descriçãoLocal" android:textColor="@android:color/black" android:textSize="24sp" /> <!-- 描述内容(去掉固定高度,改成wrap_content) --> <com.uncopt.android.widget.text.justify.JustifiedTextView android:id="@+id/txtDescricaoLocal" android:layout_width="360dp" android:layout_height="wrap_content" android:layout_below="@id/descricao" android:layout_centerHorizontal="true" android:layout_marginTop="8dp" android:textColor="@color/grey" android:textSize="18sp" /> <!-- 底部导航栏 --> <android.support.design.widget.BottomNavigationView android:id="@+id/localNav" android:layout_width="match_parent" android:layout_height="56dp" android:layout_alignParentBottom="true" app:itemBackground="@color/colorPrimary" app:itemIconTint="@android:color/white" app:itemTextColor="@android:color/white" app:menu="@menu/nav_local" /> </RelativeLayout> </ScrollView>
关键修改点说明
txtDescricaoLocal高度改为wrap_content:这样它会完全展示所有内容,不会触发内部滚动,内容超出屏幕时会由外层的ScrollView接管整页滚动。- 移除无效的Constraint约束:RelativeLayout不识别
layout_constraint属性,删掉这些属性避免布局计算混乱。 - 线性化布局依赖:用
layout_below让控件从上到下依次排列,去掉负margin和layout_above,确保布局没有重叠,ScrollView能正确计算整体内容高度。 - BottomNavigationView宽度改为
match_parent:原来的wrap_content会导致导航栏宽度不足,改成全屏更合理,同时固定在底部不影响滚动区域。
这样修改后,整个页面就会跟着ScrollView一起滚动,txtDescricaoLocal的内容也能完整展示啦!
内容的提问来源于stack exchange,提问作者Gonçalo Timóteo
相关产品推荐
相关产品推荐

