【问题标题】:Show soft keyboard in Android with Delphi OpenGL app (no FMX)使用 Delphi OpenGL 应用程序在 Android 中显示软键盘(无 FMX)
【发布时间】:2016-01-12 23:52:33
【问题描述】:

嗨。

有谁知道如何做到这一点?

我正在使用类似于以下代码的内容创建“上下文”(绘图表面):

最初:

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">

它仍然没有出现。

【问题讨论】:

    标签: android delphi opengl-es


    【解决方案1】:

    尤里卡!我有!

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

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

    我在这里仍然使用 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);
    

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

    丹尼尔。

    【讨论】:

      猜你喜欢
      • 2013-12-16
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多