MayurK
MayurK

Reputation: 1947

Roku: How to read text entered from keyboard in BrightScript?

I am writing an application for Roku in which I need to enter some text using keyboard and get the text in main.brs

I started with KeyboardExample given here: https://sdkdocs.roku.com/display/sdkdoc/Widgets+Markup (Keyboard Markup).

To pass the text to main.brs, I used global node of the roSGScreen as given in the below link. https://sdkdocs.roku.com/display/sdkdoc/Scene+Graph+Data+Scoping (Global Scope).

The following code is present in my 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

I have added the following code in 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

I am copying m.global.myText to a local variable when I receive roSGScreenEvent.isScreenClosed event.

The issue is when roSGScreenEvent.isScreenClosed is receved m.global.myText becomes invalid.

Can someone tell me what is going wrong here?

UPDATE I read about the roSGNode.ObserveField in the following link. https://sdkdocs.roku.com/display/sdkdoc/Handling+Node+Field+Changes

I added an observer for "text" field of the Keyboard as below.

keyboard.ObserveField("text", "changetext")

and I was getting changetext() callback whenever a key was pressed. But this method had the same issue.

According to the above link, an roMessagePort object can be passed to observer instread of function pointer. So I passed textPort to keyboard.xml using global variable and passed it to observer as below.

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

My expectation was to get roSGNodeEvent at textPort whenever a key was pressed. But I am not getting any events.

Upvotes: 1

Views: 1166

Answers (1)

Roman Parashchyn
Roman Parashchyn

Reputation: 106

Global node is shared between nodes of one Rosgscreen, if you screen becomes closed, you can't access it's fields. So you have to observe keyboards text and update you local variable myurl each time text is entered.

Upvotes: 1

Related Questions