• 3101阅读
  • 8回复

[讨论]Android 右上角代理菜单有时变黑 [复制链接]

上一主题 下一主题
离线yongjie
 

只看楼主 倒序阅读 楼主  发表于: 2018-02-06
屏幕下面是一输入栏(QTextEdit)。在输入文字时,用的是系统的键盘。这时,屏幕整体上移,以方便显示键盘。

QTextEdit 失去FOCUS后,键盘消失,屏幕恢复,但是右上角变黑(上面一条变黑,左上角的图标也不见了)。用手指点右上角后,菜单又出现了。

这个区域好象是Android管理的,不归QT管。

没有朋友发现这个问题?有没有解。

Windows 7, Qt5.4.2。

今天,升级5.9.4失败,又退回到5.4.2。

离线never_forget

只看该作者 1楼 发表于: 2018-02-07
版本太低了吧,现在都5.10了,建议换个环境试试~
离线yongjie

只看该作者 2楼 发表于: 2018-02-07
5.9是不是Long Term Support 版?但装不上呀。以前下的5.9.2也装不好。QtCreator起动不了。

离线zy751227

只看该作者 3楼 发表于: 2018-02-07
这个问题我2015年就上报过了,官方视而不见。
状态一直是:Status:NEED MORE INFO



https://bugreports.qt.io/browse/QTBUG-48245
离线yongjie

只看该作者 4楼 发表于: 2018-02-08
我昨天调试了一下,找到了Android的Layout Information。特别是ActionBar。

但问题没有解决。

具体是这样的:
利用QTextEdit的focusOutEvent, 利用QtNative::activity, 再找ActionBar。
void PlainTextEdit_Menu::focusOutEvent(QFocusEvent *event)
{
    QPlainTextEdit::focusOutEvent(event);
#ifdef Q_OS_ANDROID
    if (mainWindow) {
        if (mainWindow) {
            void androidActionBarHide();
            void androidActionBarShow();
            qDebug() << "androidActionBarHide() called";
            //androidActionBarHide();
            androidActionBarShow();
        }
    }
#endif
}

void androidActionBarHide()
{
    QAndroidJniObject::callStaticObjectMethod("info/suanchou/math/suanchou/Util",
                                              "androidActionBarHide",
                                              "()V");
}

void androidActionBarShow()
{
    QAndroidJniObject::callStaticObjectMethod("info/suanchou/math/suanchou/Util",
                                              "androidActionBarShow",
                                              "()V");
}

---------------------------------------

static void androidActionBarHide() {
    Log.w("Suanchou", "androidActionBarHide");
    Activity activity = org.qtproject.qt5.android.QtNative.activity();
    ActionBar bar = activity.getActionBar();
    Log.w("Suanchou", "Tab count = " + bar.getTabCount());
    bar.hide();
    //View view = activity.getView();
    //view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
    Log.w("Suanchou", "androidActionBarHide exit");
    //view.performClick();
    }
    static void androidActionBarShow() {
    Log.w("Suanchou", "androidActionBarShow");
    Activity activity = org.qtproject.qt5.android.QtNative.activity();
    ActionBar bar = activity.getActionBar();
    bar.show();
    View view = activity.getCurrentFocus();
    if (view == null) {
        Log.w("Suanchou", "view is null");
        return;
    }
    Log.w("Suanchou", "view " + view.toString());
    ViewParent p = view.getParent();
    ViewParent child = p;
    while (p != null && p.getParent() != null) {
        Log.w("Suanchou", "viewParent: " + p.toString());
        child = p;
        p = p.getParent();
    }
    Log.w("Suanchou", "out of loop");
    Rect rect = new Rect(0, 0, 3000, 500);
    //p.invalidateChild(child, rect);
    p.requestLayout();
    Log.w("Suanchou", "androidActionBarShow exit");
    }

现在的问题是:让Android repaint ActionBar。我对Android也不太熟,代码中是胡乱试试的。
有谁对Android的Layout比较熟悉,解释一下,怎么repaint ?
已有的信息是TabCount是0,这个也比较奇怪。
离线yongjie

只看该作者 5楼 发表于: 2018-02-08
我怀疑这是QT的问题。

早期,安卓有四个按键,有一个Menu键。后来,有了这个ActionBar,就变成三个键。Menu跑到右上角。
但Qt是所有系统都支持,所以可以这中间,就可能把repaint event给封住了。

我的猜想。
离线yongjie

只看该作者 6楼 发表于: 2018-02-08
可以考虑用Delay的方法,即键盘消失后,再重新访问的方法来处理。

供大家参考。
离线yongjie

只看该作者 7楼 发表于: 2018-02-23
网上查到一个设置,加上去,果然好了。

在manifest.xml 中的Activity 里,加上:
android:windowSoftInputMode="stateUnchanged|adjustResize"

我自己试着做FocusIn, FocusOut的event,改变大小,再恢复大小,也可以。
但是不知道怎么拿到软键盘的大小,所以到其它终端上还是会有问题。

还是系统内在的解决方案好。
离线yongjie

只看该作者 8楼 发表于: 2018-02-23
快速回复
限100 字节
 
上一个 下一个