我寫的Roku的應用程序中,我需要用鍵盤輸入一些文字,並獲得main.brsRoku:如何閱讀BrightScript中從鍵盤輸入的文本?
文字我開始與這裏給出KeyboardExample:https://sdkdocs.roku.com/display/sdkdoc/Widgets+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")
當我按下某個按鍵時,我得到了changetext()回調。但是這種方法有同樣的問題。
根據上面的鏈接,一個roMessagePort對象可以傳遞給觀察者函數指針的未讀函數。所以我通過textPort到keyboard.xml使用global變量並將它傳遞給觀察者,如下所示。
keyboard.ObserveField("text", m.global.myTextPort)
我的期望是讓roSGNodeEvent在textPort只要按下一個關鍵。但我沒有收到任何事件。
謝謝@Roman Parashchyn!這裏我的觀察是主線程將在「msg = wait(0,m.textPort)」處等待。現在我將超時值更改爲100ms,並將文本複製到本地變量中。有沒有更好的解決方案來解決這個問題? – MayurK
M.global.observefield(「fieldname」,port)將在每次此字段更改時生成事件。您將收到rosgnodeevent,您可以在其中閱讀正確的值 –
Hi @Roman Parashchyn,我在main.brs中添加了M.global.observefield(「text」,m.textPort),但它不起作用。但「文本」是鍵盤組件中的一個字段嗎?如果我只是在observefield()中放置「文本」,這樣好嗎? – MayurK