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

如何让Android副显示屏的WebView唤起对应屏幕的软键盘?

解决Android副屏WebView软键盘仅在主屏弹出的问题(API 30)

问题背景

我有一台配备两块独立触摸屏的Android设备(API 30/Android 11),已成功通过Presentation在副屏加载全屏可交互的WebView,但遇到副屏输入框获焦时,软键盘仅在默认主屏弹出的问题。尝试参考官方多屏IME支持文档但API30中无对应类,参考相关方案未成功,现已引入AOSP键盘但不知如何配置使其在副屏工作。

核心原因

  1. Presentation默认窗口属性未明确告知系统该窗口支持显示IME,导致系统判定副屏不具备IME展示能力,自动将键盘导向主屏。
  2. WebView初始化方式错误(直接实例化WebViewActivity),未正确关联副屏窗口的上下文和焦点。

解决方案步骤

1. 修正Presentation的窗口属性

在SecondaryScreen类的onCreate方法中,显式配置窗口支持IME,并设置正确的软输入模式:

public class SecondaryScreen extends Presentation {
    private String url = "https://www.google.com/"; // 默认URL

    public SecondaryScreen(Context context, Display display) {
        super(context, display);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.webview_base);

        // 配置窗口支持IME显示
        Window window = getWindow();
        if (window != null) {
            // 设置窗口类型为应用窗口,确保系统识别为可承载IME的窗口
            window.setType(WindowManager.LayoutParams.TYPE_APPLICATION);
            // 配置软输入模式:隐藏初始键盘+窗口随键盘调整大小
            window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
                    | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
        }

        // 正确初始化WebView(从布局中获取,而非直接实例化Activity)
        WebView webView = findViewById(R.id.webview);
        if (webView != null) {
            WebSettings settings = webView.getSettings();
            settings.setJavaScriptEnabled(true);
            settings.setDomStorageEnabled(true);
            // 让WebView获取焦点,确保输入事件能正确触发IME
            webView.requestFocus(View.FOCUS_DOWN);
            webView.loadUrl(url);
        }
    }

    public void setUrl(String incomingUrl) {
        url = incomingUrl;
    }
}

2. 使用副屏专属上下文启动Presentation

启动副屏时,使用当前Activity的createDisplayContext获取副屏的专属上下文,确保窗口与副屏绑定更紧密:

DisplayManager dm = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE);
Display[] displays = dm.getDisplays();
if (displays.length > 1) {
    // 获取副屏的专属上下文
    Context secondaryContext = createDisplayContext(displays[1]);
    SecondaryScreen ss = new SecondaryScreen(secondaryContext, displays[1]);
    ss.show();
}

3. 配置AOSP键盘适配多屏

如果使用自定义AOSP键盘,需要做以下调整:

  • 在键盘的AndroidManifest.xml中声明多屏支持:
    <uses-feature android:name="android.hardware.display.multiple"/>
    
  • 在InputMethodService子类中重写onComputeInsets,确保键盘能适配副屏布局:
    @Override
    public void onComputeInsets(InputMethodService.Insets outInsets) {
        super.onComputeInsets(outInsets);
        // 让键盘的Insets与可视区域对齐,适配副屏显示
        outInsets.contentInsets.set(outInsets.visibleInsets);
        outInsets.visibleInsets.set(outInsets.visibleInsets);
    }
    

4. 添加必要权限

在应用的AndroidManifest.xml中添加以下权限:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

关键说明

  • API30中官方文档提到的部分多屏IME类尚未开放,因此通过调整窗口属性和上下文绑定来绕过系统判定。
  • 禁止直接实例化WebViewActivity,Activity必须通过系统启动流程创建,直接实例化会导致上下文、窗口关联失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 22:32:05