Android中如何实现Button始终紧贴ScrollView下方无空白不被遮挡
实现方案
你需要将根布局替换为垂直方向的LinearLayout,利用权重属性限制ScrollView的最大高度,具体修改后的XML代码如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/appinfo_parent" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#FFFFFF"> <!-- TOP LAYOUT 部分和原有逻辑完全一致 --> <RelativeLayout android:id="@+id/top_layout_appinfo" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp"> <ImageView android:id="@+id/launcher_iv" android:layout_width="90dp" android:layout_height="75dp" app:srcCompat="@drawable/mbi" /> <TextView android:id="@+id/appname_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="5dp" android:layout_toRightOf="@id/launcher_iv" android:text="APPNAMN" android:textColor="@color/colorPrimaryDark" /> <ImageView android:id="@+id/appinfo_settings_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:src="@drawable/outline_more_vert_black_36" /> </RelativeLayout> <!-- 核心修改点:给ScrollView设置layout_weight属性 --> <ScrollView android:id="@+id/appinfo_scrollv" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" android:orientation="vertical"> <androidx.gridlayout.widget.GridLayout android:id="@+id/appinfo_gridLayout1" android:layout_width="match_parent" android:layout_height="wrap_content" app:columnCount="2" app:rowCount="12"> <!-- PACKAGE --> <TextView android:id="@+id/packagename_tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="PACKAGENAME" android:textColor="@color/colorPrimaryDark" android:textStyle="bold" /> <TextView android:id="@+id/packagename_tv_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="cell2" android:textColor="@color/colorPrimary" /> <!-- VERSION --> <TextView android:id="@+id/version_tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="VERSION" android:textColor="@color/colorPrimaryDark" android:textStyle="bold" /> <TextView android:id="@+id/version_tv_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0.000" android:textColor="@color/colorPrimary" /> <!-- MIN SDK --> <TextView android:id="@+id/min_sdk_tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="MIN SDK" android:textColor="@color/colorPrimaryDark" android:textStyle="bold" /> <TextView android:id="@+id/min_sdk_tv_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0.000" android:textColor="@color/colorPrimary" /> <!-- MAX SDK --> <TextView android:id="@+id/target_sdk_tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="MAX SDK" android:textColor="@color/colorPrimaryDark" android:textStyle="bold" /> <TextView android:id="@+id/target_sdk_tv_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0.000" android:textColor="@color/colorPrimary" /> <!-- SIZE SDK --> <TextView android:id="@+id/size_tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="SIZE" android:textColor="@color/colorPrimaryDark" android:textStyle="bold" /> <TextView android:id="@+id/size_tv_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="0.000" android:textColor="@color/colorPrimary" /> <!-- ENABLED SDK --> <TextView android:id="@+id/enable_tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ENABLED" android:textColor="@color/colorPrimaryDark" android:textStyle="bold" /> <TextView android:id="@+id/enable_tv_content" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="true" android:textColor="@color/colorPrimary" /> </androidx.gridlayout.widget.GridLayout> <!-- PERMISSIONS --> <TextView android:id="@+id/permissions_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="PERMISSIONS" android:textColor="@color/colorPrimaryDark" android:textStyle="bold" /> <LinearLayout android:id="@+id/permissions_ll" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> </LinearLayout> </LinearLayout> </ScrollView> <!-- 按钮不需要额外相对布局属性,垂直排列会自动放在ScrollView下方 --> <ImageButton android:id="@+id/imgButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#FFFFFF" android:src="@drawable/draghandle" /> </LinearLayout>
核心修改说明
- 根布局从
RelativeLayout改为垂直LinearLayout,高度设置为match_parent - ScrollView的高度改为
0dp,新增android:layout_weight="1"属性:该属性会让ScrollView优先占用顶部布局和按钮之外的所有剩余空间,内容不足时高度自动收缩,内容溢出时自动滚动,永远不会挤压按钮的显示位置 - 按钮不需要设置
align_parent_bottom或者layout_below属性,LinearLayout垂直排列逻辑会自动将其固定在ScrollView正下方
内容的提问来源于stack exchange,提问作者java
相关产品推荐
相关产品推荐

