Я пишу приложение для Roku, в котором мне нужно ввести текст с помощью клавиатуры и получить текст в main.brsRoku: Как читать текст, введенный с клавиатуры в BrightScript?
Я начал с KeyboardExample приведенного здесь: https://sdkdocs.roku.com/display/sdkdoc/Widgets+Markup (Keyboard Markup).
Чтобы передать текст в main.brs, я использовал глобальный узел roSGScreen, как указано в приведенной ниже ссылке. https://sdkdocs.roku.com/display/sdkdoc/Scene+Graph+Data+Scoping (Глобальный масштаб).
Следующий код присутствует в моем main.brs
Sub getTextFromUser()
screen = CreateObject("roSGScreen")
m.textPort = CreateObject("roMessagePort")
screen.setMessagePort(m.textPort)
m.global = screen.getGlobalNode()
m.global.id = "GlobalNode"
m.global.addFields({myText: "Not initialized"})
scene = screen.CreateScene("KeyboardExample")
screen.show()
while(true)
msg = wait(0, m.textPort)
msgType = type(msg)
if msgType = "roSGScreenEvent"
if msg.isScreenClosed()
myURL = m.global.myText
return
end if
end if
end while
End Sub
я добавил следующий код в keyboard.xml
function onKeyEvent(key as String, press as Boolean) as Boolean
keyboard = m.top.findNode("exampleKeyboard")
if keyboard.text <> invalid
m.global.myText= keyboard.text
end if
return false
end function
Я копировальный m.global.myText к локальная переменная, когда я получаю roSGScreenEvent.isScreenClosed событие.
Вопрос в том, когда roSGScreenEvent.isScreenClosed является receved m.global.myText становится недействительным.
Может кто-нибудь сказать мне, что здесь происходит не так?
UPDATE Я читал о roSGNode.ObserveField в следующей ссылке. https://sdkdocs.roku.com/display/sdkdoc/Handling+Node+Field+Changes
Я добавил наблюдатель от «текста» поле клавиатуры, как показано ниже.
keyboard.ObserveField("text", "changetext")
и я получал чекетекст() обратного вызова всякий раз, когда нажата клавиша. Но этот метод имел ту же проблему.
В соответствии с приведенной выше ссылкой объект-объект roMessagePort может быть передан наблюдателю с указателем функции. Поэтому я прошел textPort до keyboard.xml используя глобальный переменную и передал ее наблюдателю, как показано ниже.
keyboard.ObserveField("text", m.global.myTextPort)
Мое ожидание было получить roSGNodeEvent в textPort всякий раз, когда клавиша была нажата. Но я не получаю никаких событий.
Спасибо @Роман Паращин! Здесь мое наблюдение заключается в том, что основной поток будет ждать «msg = wait (0, m.textPort)». На данный момент я изменил значение тайм-аута на 100 мс и копировал текст в свою локальную переменную. Есть ли лучшее решение этой проблемы? – MayurK
M.global.observefield ("fieldname", port) генерирует событие каждый раз, когда это поле изменяется.Вы получите rosgnodeevent, где вы можете прочитать правильное значение –
Привет @Roman Parashchyn, я добавил M.global.observefield («текст», m.textPort) в main.brs, но это не сработало. Но «текст» - это поле в компоненте клавиатуры? Это нормально, если я просто поместил «текст» в watchfield()? – MayurK