7

有没有办法将 NativeActivity 的内容设置为用 Java 创建的组件(例如 FrameLayout、ImageView 等)?我需要使用 NativeActivity(用于在 Xperia Play 上获取触摸板输入),但我还需要能够查看在 Java 代码中创建的组件。

我已经尝试覆盖 onCreate 命令并在那里调用 setContentView,但是虽然这不会引发任何错误,但它也没有做任何事情(显然是因为内容视图已经由本机代码设置)。是否有某种窗口 id 或我可以传递给本机代码的东西来告诉它内容视图应该是什么,或者可以在 XML 中以某种方式设置它以将 NativeActivity 的内容视图设置为我可以修改的组件来自Java?

如果您需要更多信息,请告诉我。

4

1 回答 1

12

我会在这里为其他有同样问题的人发布答案,因为我最终找到了一种可行的方法。

在 onCreate() 方法中,如果您要设置任何特定的窗口标志(FEATURE_NO_TITLE、FLAG_FULLSCREEN、FLAG_KEEP_SCREEN_ON 等),请在调用 super.onCreate() 之前执行这些操作(否则它们将被忽略)。然后无论您通常将其放在哪里:

setContentView( whatever );

改为这样做:

getWindow().takeSurface( null );
getWindow().setContentView( whatever );

这是从 Java 端获取要控制的内容的基本方法。代码中处理内容的任何地方,使用“getWindow()”而不是“this”。

需要记住的其他一些事情是,不会调用普通的 onKey 和 onTouch 方法(它们的本地等效方法将被调用),因此如果您需要能够在 Java 端处理输入,则必须设置建立一些 JNI 链接以将信息从本机发送到 Java。我相信其他所有内容都包含在官方的 XPeria Play 触摸板示例代码中(AndroidManifest.xml 的添加和其他内容)。

如果您想查看我的项目以供参考,它是开源的,可以在以下位置找到:

http://www.paulscode.com/forum/index.php?topic=75.msg1540#msg1540

只需单击“XPeria Play 触摸板示例”旁边的“源代码”链接。不过,它可能对您没有那么有用,因为它是一个相当大的项目,可能很难找到您正在寻找的东西。如果您有任何问题,请在我的论坛上发布问题或给我发电子邮件,我将很乐意提供帮助。

于 2011-11-27T23:12:09.690 回答