我一直试图将一个代号内的youtube视频嵌入一个应用程序中。当我同时在Android和iOS上运行模拟器时,看起来不错,但是当我在Galaxy S7上实际运行该应用程序时,没有任何显示。我尝试使用BrowserComponent和WebBrowser都无法正常工作。我的代码如下:

    Form hi = new Form("Hi World", BoxLayout.y());
    Display display = Display.getInstance();

    BrowserComponent browser = new BrowserComponent();
    //WebBrowser browser = new WebBrowser();
    String videoUrl = "https://www.youtube.com/embed/r6VO3zaBJGY";

    int videoWidth = (int) ((double) display.getDisplayWidth());
    int videoHeight = (int) ((double) videoWidth*0.5625);

    String integrationCode= "<iframe src=\"" +videoUrl+"\" frameborder=\"0\"  width=\"" + videoWidth + "\" height=\"" + videoHeight + "\" allow=\"autoplay; encrypted-media\" allowfullscreen></iframe>";
    browser.setPage(integrationCode, null);
    browser.getAllStyles().setPadding(0, 0, 0, 0);
    browser.getAllStyles().setMargin(0, 0, 0, 0);

    Container browserContainer = new Container(new BorderLayout(CENTER_BEHAVIOR_CENTER));
    browserContainer.add(CENTER, browser);
    hi.add(browserContainer);

    hi.show();

最佳答案

该代码中有两个错误:BoxLayoutCENTER_BEHAVIOR_CENTER

这不起作用的原因与布局的工作方式有关。布局管理器使用首选大小为组件提供正确的大小。 BrowserComponent没有合适的首选大小,因为HTML的呈现是异步的,并且开始时非常灵活。在这种情况下,您使用了两个遵循首选大小的布局管理器。它们的大小等于零,并适当放置浏览器组件。
BoxLayout.Y_AXIS需要首选的高度,而CENTER_BEHAVIOR_CENTER需要首选的大小,以将组件放置在中心。

典型的解决方法是使用常规的BorderLayout(默认为缩放行为)。这会拉伸(stretch)中心组件以占用可用空间。请注意,您需要在Form本身上进行设置,因为它具有整个屏幕的硬编码大小。中心位置忽略首选大小,并为组件提供完整大小。

它还解决了另一个问题。默认情况下,Form在Y轴上可滚动。代号的可滚动性一个组件和本机窗口小部件(例如Web)可能会发生冲突,因此,通过使用边框布局,您可以隐式禁用滚动,在这种情况下可以提供出色的UX。

请注意,通过覆盖calcPreferredSize()中的BrowserComponent并返回组件所需的大小,可以使上面的代码起作用。由于滚动性问题,我认为这不会带来良好的用户体验。

10-07 17:04