uni-app Android上在软键盘弹出后,点击back或点击非置焦区域可收起软键盘失效

发布于 1周前 作者 songsunli 来自 Uni-App

uni-app Android上在软键盘弹出后,点击back或点击非置焦区域可收起软键盘失效

操作步骤:

  • input输入框获取焦点调起键盘后点击其他区域无法失去焦点

预期结果:

  • input输入框获取焦点调起键盘后点击其他区域无法失去焦点

实际结果:

  • input输入框获取焦点调起键盘后点击其他区域无法失去焦点

bug描述:

  • Android上在软键盘弹出后,点击back或点击非置焦区域可收起软键盘,功能失效

Image

4e976893596aa4a3eb944f32e969934f.rar

开发环境 版本号 项目创建方式
Windows win10 HBuilderX
4.28
Android 7.1.1
商米收银机 D1s
vue3

5 回复

是 vue 还是 nvue?提供下 HBuilderX 的具体版本,和简单的单页面源码吧。
补充 我测试 vue3 运行到安卓真机,input blur 后收起键盘是好的,具体看你的写法


nvue HBuilderX 的具体版本4.24

普通手机是正常的,我用的是商米收银机

回复 t***@tongcl.com: 按照私聊沟通的,业务上规避或者改用 vue 渲染页面

在uni-app开发中,遇到Android平台上软键盘弹出后,点击返回键(back)或非置焦区域无法收起软键盘的问题,通常可以通过监听相关事件和手动处理软键盘的收起逻辑来解决。以下是一个可能的解决方案,通过自定义组件和事件监听来实现这一功能。

解决方案概述

  1. 监听软键盘弹出和隐藏事件:使用onPageScroll或自定义监听器来检测软键盘状态。
  2. 处理返回键事件:在App.vue中监听返回键事件,根据软键盘状态决定是否收起软键盘。
  3. 处理非置焦区域点击事件:在需要隐藏软键盘的页面上添加一个全屏的透明遮罩层,监听其点击事件来收起软键盘。

代码示例

1. 监听软键盘状态

在页面的onReady生命周期中,可以监听页面的滚动事件来间接判断软键盘状态(因为软键盘弹出通常会导致页面高度变化):

onReady() {
    this.pageHeight = uni.getSystemInfoSync().windowHeight;
    uni.onPageScroll((res) => {
        if (res.scrollTop === 0 && this.pageHeight < uni.getSystemInfoSync().windowHeight) {
            // 软键盘弹出
            this.keyboardVisible = true;
        } else {
            // 软键盘隐藏
            this.keyboardVisible = false;
        }
    });
}

2. 处理返回键事件

App.vue中监听返回键事件,根据软键盘状态决定是否拦截默认行为:

onBackPress(options) {
    if (this.keyboardVisible) {
        // 手动收起软键盘
        uni.hideKeyboard();
        return true; // 拦截默认返回行为
    }
    return false; // 不拦截默认返回行为
}

注意:onBackPress方法需要在App.vueonLaunchonShow中通过plus.key.addEventListener进行监听(仅5+App适用)。

3. 处理非置焦区域点击事件

在页面中添加一个全屏透明遮罩层,并监听其点击事件:

<template>
    <view class="container">
        <!-- 页面内容 -->
        <view class="overlay" @click="hideKeyboard"></view>
    </view>
</template>

<script>
export default {
    methods: {
        hideKeyboard() {
            if (this.keyboardVisible) {
                uni.hideKeyboard();
            }
        }
    }
}
</script>

<style>
.overlay {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 999; /* 确保遮罩层在最上层 */
    background-color: rgba(0, 0, 0, 0); /* 透明 */
}
</style>

以上代码提供了一个基本的解决方案框架,你可能需要根据实际项目需求进行调整和优化。特别是软键盘状态的监听,可能需要更精确的方法来判断软键盘的弹出和隐藏。

回到顶部