Qt on Android,输入法弹出后,界面无法自适应

界面被顶出屏幕

第一个遇到的问题是,在不对 AndroidMainifest.xml 修改情况下,当界面中有输入框,且位于屏幕底部,在弹出输入框的时候,顶部的工具栏被顶出界面。

在查阅安卓接口之后,你在 AndroidMainifest.xml 中的 activity 标签添加了 android:windowSoftInputMode="adjustUnspecified"

< activity  android:windowSoftInputMode="adjustResize"
    ...>

由于 Qt on Android 的实现问题,在 Window 的大小调整的时候,会闪烁。( Qt on Android 中,不宜多窗体,在窗体之间切换的时候,会僵死,但是对话框可以使用)。

界面缩放的时候闪屏

经上述设置后,你发现,在弹出输入法的时候,界面可以很好适应,工具栏不会被顶出屏幕,但是,在输入法弹出的时候,界面窗体的大小被调整,所以会闪烁,并且很鬼畜。

解决

首先查看 Sparrow,以及简单易用的页面栈框架。这两篇文章,讲明了 QtQuick.Control 上 ApplicationWindow 的工具栏无法在安卓应用下灵活使用。

使用了 Sparrow,之后,页面中的工具栏可以自由的指定位置。

接下来就是,在安卓中,获取键盘高度。将获取的高度作为页面中 topBar 位移的大小。

一下为java代码,在activity中获取键盘高度的代码。

public static void listenKeyboardHeight() {
        if(!hasListenVirtualKeyboard) {
            final View myRootView = getRootView(m_instance);
            myRootView.getViewTreeObserver().addOnGlobalLayoutListener(
            new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {

                    Rect outRect = new Rect();
                    m_instance.getWindow().getDecorView().getWindowVisibleDisplayFrame(outRect);

                    m_keyboardRectangle = new Rect();
                    myRootView.getWindowVisibleDisplayFrame(m_keyboardRectangle);

                    int screenHeight = myRootView.getRootView().getHeight();
                    // 小于100 就不行了
                    // 这里还要减去状态栏的高度
                    // 魔幻数字
                    int magic = 5;
                    int virtualKeyboardHeight = screenHeight - (m_keyboardRectangle.bottom - m_keyboardRectangle.top) - outRect.top - magic;

                    if( virtualKeyboardHeight < 100 ) {
                        virtualKeyboardHeight = 0;
                    }

                    QtNative.notifiedKeyboardRectangle(
                            m_keyboardRectangle.centerX(),
                            m_keyboardRectangle.centerY(),
                            m_keyboardRectangle.width(),
                            virtualKeyboardHeight);
                }
            });
            hasListenVirtualKeyboard = true;
        }
    }

获取键盘高度,通过调用

QtNative.notifiedKeyboardRectangle(
                            m_keyboardRectangle.centerX(),
                            m_keyboardRectangle.centerY(),
                            m_keyboardRectangle.width(),
                            virtualKeyboardHeight);

这个代码通知 c++ 这边,键盘大小改变了。

就可以在 qml 中获取到键盘高度了。

实际应用在 WellChat。中有完整代码。

Android获取屏幕高度、状态栏高度、标题栏高度

Android 如何实现在隐藏键盘后,让输入框保持当前高度,类似QQ、微信聊天窗口。

如何获得软键盘的尺寸信息?

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值