使用Delphi OpenGL应用程序在Android中显示软键盘(无FMX)

时间:2016-01-12 23:52:34

标签: android delphi opengl-es

Hiyas。

有谁知道如何实现这个目标?

我正在创建一个" context" (绘图表面),如下面的代码:

最初:

FApp:= Pandroid_app(PANativeActivity(DelphiActivity)^.instance);

FApp.userData:= Self;
FApp.onAppCmd:= OnAppCmd;

在OnAppCmd中收到APP_CMD_INIT_WINDOW后:

FDisplay := eglGetDisplay(EGL_DEFAULT_DISPLAY);
eglInitialize(FDisplay, nil, nil);
eglChooseConfig(FDisplay, @attribs[0], @config, 1, @numConfigs);
eglGetConfigAttrib(FDisplay, config, EGL_NATIVE_VISUAL_ID, @format);

ANativeWindow_setBuffersGeometry(FApp.window, 0, 0, format);

FSurface := eglCreateWindowSurface(FDisplay, config, FApp.window, nil);
FContext := eglCreateContext(FDisplay, config, nil, nil);

if  (eglMakeCurrent(FDisplay, FSurface, FSurface, FContext) = EGL_FALSE) then
    begin
    Abort;
    end;

但是,我似乎需要一个"视图"为了使它集中,我可以告诉Android系统启用并显示它的键盘。以下代码不起作用(因为我不相关,我相信):

ANativeActivity_showSoftInput(PANativeActivity(DelphiActivity), 0);

有没有人知道如何在没有任何FireMonkey代码的情况下获取视图?

我发现一个参考似乎表明FApp ^ .window是一个SurfaceHolder(因为那是你在他们的示例代码中传递给eglCreateWindowSurface的那些)但是这似乎不起作用或者非常关注我远。

我是否需要在Java中执行某些操作并创建GLSurfaceView后代?但是我该怎么做?

非常感谢任何帮助。

丹尼尔。

编辑:

我仍然试图让它发挥作用。我能找到的所有例子都是用Java编写的,所以我试图复制它们。

OnAppCmd中的APP_CMD_GAINED_FOCUS之后我使用以下代码:

    CallInUIThread(procedure
    var
    wnd: JWindow;
    ctx: JContext;
    ctxcls: JContextClass;
    imm: JInputMethodManager;
    immcls: JInputMethodManagerClass;

    begin
    wnd:= TJNativeActivity.Wrap(PANativeActivity(System.DelphiActivity)^.clazz).getWindow;
    wnd.getDecorView.setFocusable(True);
    wnd.getDecorView.setFocusableInTouchMode(True);

    ctx:= wnd.getContext;
    ctxcls:= JContextClass(ctx.getClass);

    imm:= JInputMethodManager(TJNativeActivity.Wrap(PANativeActivity(System.DelphiActivity)^.clazz).getSystemService(ctxcls.INPUT_METHOD_SERVICE));
    if  Assigned(imm) then
        begin
        immcls:= JInputMethodManagerClass(imm.getClass);
        imm.showSoftInput(wnd.getDecorView, immcls.SHOW_FORCED);
        end;
    end);

它使用了一些FireMonkey框架(用于在" UI"线程中执行,因为尝试访问窗口否则会产生系统错误,视图无法被任何其他线程触及)但是我应该能够通过实现JRunnable来替换它。我还没有一个合乎逻辑的"视图...

然而,这段代码的真正问题是当我尝试从上下文中获取它时,imm没有赋值。所有Java示例都假设它将是。

进一步编辑:

我认为作为最后的努力,我用以下几行修改了AndroidManifest.template.xml文件:

    android:configChanges="orientation|keyboard"
    android:windowSoftInputMode="stateAlwaysVisible">

它仍然没有出现。

1 个答案:

答案 0 :(得分:0)

尤里卡!我有它!

我应该早点得到它,因为我正在复制FMX所做的事情,但我当时认为我可以更简单地做,即做他们用Java做的事情。

似乎不是使用InputMethodManager,而是需要访问Delphi为Android应用程序创建的本机活动实例的“TextEditorProxy”。

我仍然在这里使用FireMonkey框架的一部分来调用CallInUIThread但是我会用我自己的JRunnable及时替换它并调用Activity的runOnUiThread。

不用多说,这里是代码:

    CallInUIThread(procedure
            var
            fmx: JFMXNativeActivity;
            TextView: JFMXTextEditorProxy;

            begin
            fmx:= TJFMXNativeActivity.Wrap(FApp^.activity.clazz);
            TextView:= fmx.getTextEditorProxy;
            TextView.setFocusable(true);
            TextView.setFocusableInTouchMode(true);
            TextView.requestFocus;
            TextView.showSoftInput(true);
            end);

我仍然不确定输入的位置,但我希望能找到答案。

丹尼尔。