2016-07-08 73 views
1

我寫的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對象可以傳遞給觀察者函數指針的未讀函數。所以我通過textPortkeyboard.xml使用global變量並將它傳遞給觀察者,如下所示。

keyboard.ObserveField("text", m.global.myTextPort) 

我的期望是讓roSGNodeEventtextPort只要按下一個關鍵。但我沒有收到任何事件。

回答

0

全局節點在一個Rosgscreen的節點之間共享,如果屏幕變爲關閉狀態,則無法訪問它的字段。因此,每次輸入文本時,您都必須遵守鍵盤文本並更新本地變量myurl。

+0

謝謝@Roman Parashchyn!這裏我的觀察是主線程將在「msg = wait(0,m.textPort)」處等待。現在我將超時值更改爲100ms,並將文本複製到本地變量中。有沒有更好的解決方案來解決這個問題? – MayurK

+0

M.global.observefield(「fieldname」,port)將在每次此字段更改時生成事件。您將收到rosgnodeevent,您可以在其中閱讀正確的值 –

+0

Hi @Roman Parashchyn,我在main.brs中添加了M.global.observefield(「text」,m.textPort),但它不起作用。但「文本」是鍵盤組件中的一個字段嗎?如果我只是在observefield()中放置「文本」,這樣好嗎? – MayurK