2016-07-08 8 views
1

Я пишу приложение для 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 всякий раз, когда клавиша была нажата. Но я не получаю никаких событий.

ответ

0

Глобальный узел разделяется между узлами одного Rosgscreen, если экран закрывается, вы не можете получить доступ к его полям. Таким образом, вы должны соблюдать текст клавиатуры и обновлять локальную переменную myurl при каждом вводе текста.

+0

Спасибо @Роман Паращин! Здесь мое наблюдение заключается в том, что основной поток будет ждать «msg = wait (0, m.textPort)». На данный момент я изменил значение тайм-аута на 100 мс и копировал текст в свою локальную переменную. Есть ли лучшее решение этой проблемы? – MayurK

+0

M.global.observefield ("fieldname", port) генерирует событие каждый раз, когда это поле изменяется.Вы получите rosgnodeevent, где вы можете прочитать правильное значение –

+0

Привет @Roman Parashchyn, я добавил M.global.observefield («текст», m.textPort) в main.brs, но это не сработало. Но «текст» - это поле в компоненте клавиатуры? Это нормально, если я просто поместил «текст» в watchfield()? – MayurK