您的位置:首页 > 移动开发 > Android开发

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

2015-09-18 14:33 507 查看

界面被顶出屏幕

第一个遇到的问题是,在不对
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、微信聊天窗口。

如何获得软键盘的尺寸信息?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: