gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 14:51:36 28 4
gpt4 key购买 nike

希亚斯。

有人知道如何实现吗?

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

最初:

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;

但是,我似乎需要一个“ View ”来使其聚焦,这样我就可以告诉 Android 系统为其启用并显示键盘。以下代码不起作用(我相信是因为我没有焦点):

ANativeActivity_showSoftInput(PANativeActivity(DelphiActivity), 0);

有谁知道如何在没有任何 FireMonkey 代码的情况下获取 View ?

我找到了一个似乎暗示 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”线程中执行,因为尝试访问窗口否则会出现系统错误,即任何其他线程都无法访问 View )但我应该能够替换它通过实现 JRunnable。我也仍然没有“逻辑”观点......

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

进一步编辑:

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

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

还是没有出现。

最佳答案

Eureka !我有!

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

看来我需要访问 Delphi 为 Android 应用程序创建的 native Activity 实例的“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);

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

丹尼尔。

关于android - 使用 Delphi OpenGL 应用程序在 Android 中显示软键盘(无 FMX),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34755992/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com