Использование Browserfield.displayContent с <frame>, который имеет внешний URL
Я пытаюсь создать экран для приложения Blackberry 5.0+ с баннером вверху, а затем Browserfield
под этим просматривается внешний сайт. Баннер размещается на одном сайте, а контент для BrowserField
размещен на другом.
Первоначально я пытался использовать 2 BrowserFields, но у меня были проблемы, когда несколько устройств не отображали баннер и отображали только содержимое под ним. Кроме того, при отображении другого экрана с такой же настройкой приложение зависнет с IllegalStateException
, Я провел небольшое исследование, и кажется, что BrowserField
кажется, есть некоторые проблемы, когда существует несколько его экземпляров одновременно.
Таким образом, чтобы обойти эту проблему, я объединил оба BrowserField
s в один, используя тег frame в html, с надеждой на показ рекламного баннера в первом кадре и контента внизу во втором кадре.
HTML, который я сделал, работает в обычном браузере:
<!DOCTYPE html>
<html>
<frameset rows="10%,90%">
<frame scrolling="no" src="http://4.bp.blogspot.com/_CZ1HhhanNgc/TI0xscVLW8I/AAAAAAAABps/sfeO4E3234k/s1600/head-mp-700x88.jpg" noresize="noresize" frameborder="0">
<frame src="http://www.penny-arcade.com" frameborder="0">
</frameset>
</html>
То, что я делаю, это чтение HTML в виде текста, удаляя \n
а также \r
s, а затем положить его в следующем методе: browserField.displayContent(html,"http://localhost");
Этот метод должен отображать HTML в браузере, но вместо этого на симуляторе я получаю это:
На устройстве я получаю пустой экран. Я не знаю, что происходит с displayContent()
метод, поэтому я бы предположил, что это не позволяет внешние сайты? Я действительно не знаю, какие у меня варианты с этого момента. Есть ли какое-то исправление для этого, какая-то библиотека, которую я могу использовать или какой-то другой способ реализовать это?
Редактировать:
Таким образом, @Nate предложил изменить DOCTYPE
тег и выложил скриншот работы html. Однако я сделал это, и я все еще получаю те же результаты, поэтому я собираюсь опубликовать код, который я использую для создания экрана. Вот:
public final class MyScreen extends MainScreen
{
/**
* Creates a new MyScreen object
*/
private BrowserField browserField;
public MyScreen()
{
// Set the displayed title of the screen
setTitle("MyTitle");
BrowserFieldConfig config = new BrowserFieldConfig();
config.setProperty(BrowserFieldConfig.VIEWPORT_WIDTH, new Integer(Display.getWidth()));
config.setProperty(BrowserFieldConfig.NAVIGATION_MODE,
BrowserFieldConfig.NAVIGATION_MODE_POINTER);
config.setProperty(BrowserFieldConfig.INITIAL_SCALE, new Float(1.0));
config.setProperty(BrowserFieldConfig.USER_SCALABLE, Boolean.FALSE);
//supposed to prevent InvalidStateException from refreshing sometimes
ProtocolController eventsProtocolController = new ProtocolController(browserField)
{
public void handleNavigationRequest(BrowserFieldRequest request) throws Exception
{
browserField.setFocus();
super.handleNavigationRequest(request);
}
};
config.setProperty(BrowserFieldConfig.CONTROLLER, eventsProtocolController);
browserField = new BrowserField(config);
try
{
String embeddedLinkFrame = readTextFile("frame.html");
browserField.displayContent(embeddedLinkFrame, "http://localhost");
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
add(browserField);
}
public String readTextFile(String fName)
{
String result = null;
DataInputStream is = null;
try
{
is = new DataInputStream(getClass().getResourceAsStream("/" + fName));
byte[] data = IOUtilities.streamToBytes(is);
result = new String(data);
}
catch (IOException e)
{
System.out.println(e.getMessage());
}
finally
{
try
{
if (null != is)
is.close();
}
catch (IOException e)
{
System.out.println(e.getMessage());
}
}
return result;
}
}
1 ответ
Хорошо, мои извинения за первый ответ. Я думаю DOCTYPE
была красная сельдь (но у меня не было вашего кода Java в то время).
Я вижу несколько потенциальных проблем:
Подключение к сети
Во-первых, как всегда, убедитесь, что у вас есть сетевое подключение для вашего устройства или симулятора. Это может включать запуск симулятора MDS. Вы всегда можете проверить соединение с обычным приложением Browser, проверив веб-сайт, который, как вы знаете, работает. Я считаю, что если у вас полное отсутствие подключения (то есть сеть отключена), то вы получите ваши кадры, показывающие только текст / URL. Тем не менее, я считаю, что это также будет иметь что-то вроде этого:
Не удалось выбрать правильный дескриптор транспорта для: http://www.penny-arcade.com/
вместо показа null
, как вы показываете.
Добавление BrowserField
Далее, я думаю, что есть проблема с тем, что вы просили в поле браузера отобразить контент, прежде чем вы добавите это поле. Просто измените порядок этих двух строк кода следующим образом:
add(browserField);
try
{
String embeddedLinkFrame = readTextFile("frame.html");
browserField.displayContent(embeddedLinkFrame, "http://localhost");
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
Я полагаю, что поведение, если у вас есть эти строки не в порядке, это просто получить пустое поле браузера.
Свойства окна просмотра
Наконец, я бы не советовал устанавливать свойства страницы программно, как вы сделали. Хотя это не будет препятствовать отображению вашей страницы, я бы рекомендовал поместить эти свойства в HTML meta
элементы:
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
</head>
Обновление: контроллер протокола
К сожалению, мой симулятор работает и отказывается поддерживать горячую замену прямо сейчас. Поэтому мне трудно много раз бегать и собирать решающие результаты. Но, похоже на то, ProtocolController
объект предотвращает эту проблему для меня. (может быть, вы можете уточнить, почему вы используете контроллер протокола в этой ситуации?). Если этот ответ был мотивом, вы можете внимательно посмотреть на полные комментарии автора о его полезности.