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

Android 13应用底部元素被导航栏遮挡的解决方法咨询

解决Android 13中应用底部元素被导航栏遮挡的问题

在Android 13系统中,应用底部元素被屏幕底部导航栏遮挡,导航栏区域有时透明、有时不透明。当前应用Manifest中MainActivity的android:theme引用@style/AppTheme,AppTheme继承@android:style/Theme.DeviceDefault.Light.NoActionBar,设置了android:windowBackground为@drawable/splash。已排查FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS标志(未设置),添加SYSTEM_UI_FLAG_LAYOUT_STABLE和SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION无效果,通过代码实现导航栏透明后,仍无法解决应用与导航栏重叠的问题,以下是可行的解决方案:


现有配置

Manifest配置

<activity android:name="com.myapp.MainActivity"
    android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"

AppTheme配置

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="@android:style/Theme.DeviceDefault.Light.NoActionBar">
        <item name="android:windowBackground">@drawable/splash</item>
    </style>
</resources>

已尝试的代码

排查FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS标志

android.view.Window window = getWindow();

if ((getWindow().getAttributes().flags & android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) != 0)
{
    Log.d(TAG, "The flag is set.");
}
else
{
    Log.d(TAG, "The flag is NOT set.");
}

添加SYSTEM_UI_FLAG_LAYOUT_STABLE和SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

window.getDecorView().setSystemUiVisibility(
    android.view.View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
    android.view.View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);

实现导航栏透明

android.view.Window window = getWindow();

window.addFlags(android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

window.setNavigationBarColor(0x00000000);

解决方案

方式1:主题+布局适配(推荐)

修改AppTheme,添加系统栏相关属性,同时在根布局开启fitsSystemWindows:

  1. 更新主题配置:
<style name="AppTheme" parent="@android:style/Theme.DeviceDefault.Light.NoActionBar">
    <item name="android:windowBackground">@drawable/splash</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:windowTranslucentNavigation">true</item>
</style>
  1. 在MainActivity的根布局中添加android:fitsSystemWindows="true":
<!-- 示例根布局 -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical">
    
    <!-- 你的页面内容 -->
    
</LinearLayout>

fitsSystemWindows="true"会让布局自动识别系统导航栏高度,为底部添加对应内边距,避免重叠。

方式2:代码设置布局适配

如果不想修改主题,可在onCreate中直接为根布局设置适配:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    // 获取根布局
    View rootView = findViewById(android.R.id.content);
    rootView.setFitsSystemWindows(true);
    
    // 确保窗口标志正确
    Window window = getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}

方式3:手动计算导航栏高度

若上述方式无效,可手动获取导航栏高度并为底部元素添加内边距:

// 获取导航栏高度
private int getNavigationBarHeight() {
    Resources resources = getResources();
    int resId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
    return resId > 0 ? resources.getDimensionPixelSize(resId) : 0;
}

// 在合适的时机调用(如onWindowFocusChanged)
@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        View bottomElement = findViewById(R.id.your_bottom_view);
        int navHeight = getNavigationBarHeight();
        // 给底部元素添加底部内边距
        bottomElement.setPadding(
            bottomElement.getPaddingLeft(),
            bottomElement.getPaddingTop(),
            bottomElement.getPaddingRight(),
            bottomElement.getPaddingBottom() + navHeight
        );
    }
}

注意:需判断导航栏是否处于显示状态,避免在导航栏隐藏时添加多余内边距。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:55:17