界面被顶出屏幕
第一个遇到的问题是,在不对 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。中有完整代码。