【发布时间】: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">
它仍然没有出现。
【问题讨论】: