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">
它仍然没有出现。
答案 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);
我仍然不确定输入的位置,但我希望能找到答案。
丹尼尔。