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

如何阻止Android Activity扩展至系统导航栏后方?

解决NativeActivity延伸至系统导航栏后方的问题

方案一:修改主题属性

自定义继承自@android:style/Theme.DeviceDefault.NoActionBar.FullScreen的主题,添加配置限制窗口范围:

<!-- res/values/styles.xml -->
<style name="CustomFullScreenTheme" parent="@android:style/Theme.DeviceDefault.NoActionBar.FullScreen">
    <!-- 禁用导航栏半透明,避免窗口延伸 -->
    <item name="android:windowTranslucentNavigation">false</item>
    <!-- 让内容自动适配系统栏,预留导航栏空间 -->
    <item name="android:fitsSystemWindows">true</item>
    <!-- 保留刘海区域的显示策略(符合预期效果) -->
    <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
</style>

在AndroidManifest.xml中,将NativeActivity的android:theme替换为该自定义主题:

<activity
    android:name="android.app.NativeActivity"
    android:theme="@style/CustomFullScreenTheme">
    <!-- 其他配置项 -->
</activity>

方案二:通过NativeActivity子类代码适配

若主题调整无效,可继承NativeActivity并在Java层处理窗口内边距:

public class CustomNativeActivity extends NativeActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Window window = getWindow();
        // 清除窗口延伸至导航栏的标记
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        window.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_STABLE, WindowManager.LayoutParams.FLAG_LAYOUT_STABLE);

        View decorView = window.getDecorView();
        decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
        // 监听窗口内边距变化,手动设置内容边距避开导航栏
        decorView.setOnApplyWindowInsetsListener((view, insets) -> {
            int navBottom = insets.getInsets(WindowInsets.Type.navigationBars()).bottom;
            view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), view.getPaddingRight(), navBottom);
            return insets.consumeSystemWindowInsets();
        });
    }
}

之后在AndroidManifest.xml中替换NativeActivity为这个自定义子类即可。

方案三:C++层直接处理窗口内边距

若业务逻辑基于C++实现,可在NativeActivity的事件回调中处理导航栏内边距:

#include <android/native_window.h>
#include <android/native_window_jni.h>

// 调整内容区域以避开导航栏
void adjustForNavigationBar(android_app* app) {
    if (app->window == nullptr) return;
    const AWindowInsets* insets = ANativeWindow_getInsets(app->window);
    if (insets == nullptr) return;

    // 获取导航栏底部内边距
    int32_t bottomInset = AWindowInsetsGetInsets(insets, AWINDOW_INSETS_TYPE_NAVIGATION_BARS).bottom;
    // 收缩内容显示区域的底部边界
    app->contentRect.bottom -= bottomInset;
}

void android_main(struct android_app* app) {
    // 初始化逻辑...

    while (true) {
        int events;
        android_poll_source* source;
        // 处理系统事件
        while (ALooper_pollAll(0, nullptr, &events, (void**)&source) >= 0) {
            if (source != nullptr) {
                source->process(app, source);
            }
            if (app->destroyRequested) {
                return;
            }
        }

        // 每次渲染前调整内容区域
        adjustForNavigationBar(app);
        // 你的渲染逻辑...
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 19:35:20