You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

核心修改说明

  1. 根布局从RelativeLayout改为垂直LinearLayout,高度设置为match_parent
  2. ScrollView的高度改为0dp,新增android:layout_weight="1"属性:该属性会让ScrollView优先占用顶部布局和按钮之外的所有剩余空间,内容不足时高度自动收缩,内容溢出时自动滚动,永远不会挤压按钮的显示位置
  3. 按钮不需要设置align_parent_bottom或者layout_below属性,LinearLayout垂直排列逻辑会自动将其固定在ScrollView正下方

内容的提问来源于stack exchange,提问作者java

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 03:45:05