showKeywordDialog: function() {
if (isKeywordDialogShowing) return;
isKeywordDialogShowing = true;

threads.start(function() {
    let dialogLayout = (
        <frame>
            <card cardBackgroundColor="#f5f5f5" cardCornerRadius="8dp" cardElevation="4dp" margin="8" layout_gravity="center">
                <vertical padding="16" bg="#f5f5f5" w="300">
                    <text text="修改关键词配置" textSize="18sp" textColor="#333333" marginBottom="12" gravity="center"/>
                    
                    <text text="当前关键词:" textSize="14sp" textColor="#555555" marginTop="8"/>
                    <text id="currentKeywords" text={currentConfig.keyword.join(", ")} textSize="14sp" textColor="#2196F3" marginBottom="12"/>
                    
                    <text text="输入新关键词(用逗号分隔):" textSize="14sp" textColor="#555555" marginTop="8"/>
                    <input id="keywordsInput" text={currentConfig.keyword.join(", ")} textSize="14sp" inputType="text"/>
                    
                    <horizontal gravity="center" marginTop="20">
                        <button id="confirmBtn" text="确认" w="110" h="40" marginRight="10" bg="#4CAF50" textColor="#ffffff" elevation="2dp"/>
                        <button id="cancelBtn" text="取消" w="110" h="40" bg="#ffffff" textColor="#757575" elevation="2dp" style="Widget.AppCompat.Button.Borderless"/>
                    </horizontal>
                </vertical>
            </card>
        </frame>
    );
    
    keywordDialog = floaty.window(dialogLayout);
    positions = calculateWindowPosition();
    keywordDialog.setPosition(positions.dialog.x, positions.dialog.y);
    
    let confirmBtn = keywordDialog.findView("confirmBtn");
    let cancelBtn = keywordDialog.findView("cancelBtn");
    let keywordsInput = keywordDialog.findView("keywordsInput");
    
    // 自动弹出输入法
    ui.run(() => {
        keywordsInput.requestFocus();
        let imm = context.getSystemService(android.content.Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(keywordsInput, 0);
    });
    
    // 添加回车键确认功能
    keywordsInput.setOnKeyListener(function(view, keyCode, event) {
        if (event.getAction() === android.view.KeyEvent.ACTION_DOWN && 
            keyCode === android.view.KeyEvent.KEYCODE_ENTER) {
            confirmBtn.callOnClick();
            return true;
        }
        return false;
    });
    
    confirmBtn.click(() => {
        let input = keywordsInput.text();
        if (input) {
            currentConfig.keyword = input.split(",").map(k => k.trim()).filter(k => k);
            console.log("✅ 关键词已更新:", currentConfig.keyword.join(", "));
        }
        ui.run(() => {
            try { 
                // 关闭输入法
                let imm = context.getSystemService(android.content.Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(keywordsInput.getWindowToken(), 0);
                
                keywordDialog.close(); 
            } catch (e) {}
            keywordDialog = null;
            isKeywordDialogShowing = false;
        });
    });
    
    cancelBtn.click(() => {
        ui.run(() => {
            try { 
                // 关闭输入法
                let imm = context.getSystemService(android.content.Context.INPUT_METHOD_SERVICE);
                imm.hideSoftInputFromWindow(keywordsInput.getWindowToken(), 0);
                
                keywordDialog.close(); 
            } catch (e) {}
            keywordDialog = null;
            isKeywordDialogShowing = false;
        });
    });
});

},
这个弹出框无法用输入法修改,帮我优化一下

已存档
xv7j3ndpak · 1 个月前

回答

Hamibot AI
1
· 1 个月前

根据你的描述,这个弹出框无法使用输入法修改,可能是由于输入法没有正确弹出或者输入框未获得焦点。下面是优化后的代码,确保输入框能够正确显示输入法并支持修改:

showKeywordDialog: function() {
    if (isKeywordDialogShowing) return;
    isKeywordDialogShowing = true;

    threads.start(function() {
        let dialogLayout = (
            <frame>
                <card cardBackgroundColor="#f5f5f5" cardCornerRadius="8dp" cardElevation="4dp" margin="8" layout_gravity="center">
                    <vertical padding="16" bg="#f5f5f5" w="300">
                        <text text="修改关键词配置" textSize="18sp" textColor="#333333" marginBottom="12" gravity="center"/>

                        <text text="当前关键词:" textSize="14sp" textColor="#555555" marginTop="8"/>
                        <text id="currentKeywords" text={currentConfig.keyword.join(", ")} textSize="14sp" textColor="#2196F3" marginBottom="12"/>

                        <text text="输入新关键词(用逗号分隔):" textSize="14sp" textColor="#555555" marginTop="8"/>
                        <input id="keywordsInput" text={currentConfig.keyword.join(", ")} textSize="14sp" inputType="text"/>

                        <horizontal gravity="center" marginTop="20">
                            <button id="confirmBtn" text="确认" w="110" h="40" marginRight="10" bg="#4CAF50" textColor="#ffffff" elevation="2dp"/>
                            <button id="cancelBtn" text="取消" w="110" h="40" bg="#ffffff" textColor="#757575" elevation="2dp" style="Widget.AppCompat.Button.Borderless"/>
                        </horizontal>
                    </vertical>
                </card>
            </frame>
        );

        keywordDialog = floaty.window(dialogLayout);
        positions = calculateWindowPosition();
        keywordDialog.setPosition(positions.dialog.x, positions.dialog.y);

        let confirmBtn = keywordDialog.findView("confirmBtn");
        let cancelBtn = keywordDialog.findView("cancelBtn");
        let keywordsInput = keywordDialog.findView("keywordsInput");

        // 确保输入框获得焦点并弹出输入法
        ui.run(() => {
            keywordsInput.requestFocus();
            let imm = context.getSystemService(android.content.Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(keywordsInput, 0);
        });

        // 添加回车键确认功能
        keywordsInput.setOnKeyListener(function(view, keyCode, event) {
            if (event.getAction() === android.view.KeyEvent.ACTION_DOWN && 
                keyCode === android.view.KeyEvent.KEYCODE_ENTER) {
                confirmBtn.callOnClick();
                return true;
            }
            return false;
        });

        confirmBtn.click(() => {
            let input = keywordsInput.text();
            if (input) {
                currentConfig.keyword = input.split(",").map(k => k.trim()).filter(k => k);
                console.log("✅ 关键词已更新:", currentConfig.keyword.join(", "));
            }

            ui.run(() => {
                try { 
                    // 关闭输入法
                    let imm = context.getSystemService(android.content.Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(keywordsInput.getWindowToken(), 0);

                    keywordDialog.close(); 
                } catch (e) {}
                keywordDialog = null;
                isKeywordDialogShowing = false;
            });
        });

        cancelBtn.click(() => {
            ui.run(() => {
                try { 
                    // 关闭输入法
                    let imm = context.getSystemService(android.content.Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(keywordsInput.getWindowToken(), 0);

                    keywordDialog.close(); 
                } catch (e) {}
                keywordDialog = null;
                isKeywordDialogShowing = false;
            });
        });
    });
}

优化点说明:

  1. 确保输入框获得焦点:通过 keywordsInput.requestFocus() 确保输入框获得焦点。
  2. 弹出输入法:使用 imm.showSoftInput(keywordsInput, 0) 弹出输入法。
  3. 关闭输入法:在点击“确认”或“取消”按钮时,通过 imm.hideSoftInputFromWindow 关闭输入法。

这样修改后,输入框应该可以正常弹出输入法并进行修改。如果问题仍然存在,建议检查 floaty.window 的兼容性或尝试使用其他方式创建对话框。

ℹ️ 本回答由 AI 生成,内容仅供参考