Ahmet Gulden
Ahmet Gulden

Reputation: 2073

BlackBerry software keyboard listener on OS 4.5 (or later) compatible code

I am developing an app which supposed to work on devices that have OS 4.5 or later. In my application I need to know when the virtual keyboard is visible or invisible. Because if virtual keyboard is visible, the text area which the user is supposed to type in is behind the keyboard. If I could determine the moment of virtual keyboards state changed, I could refresh the screen and move the text area upper location.

Is there a way to do that?

Edit: the next button is at the status panel. The edit field is at the custom horizontal field manager.

enter image description here

When I touch the edit field, the virtual keyboard opens and the contents of the edit field is lost.

enter image description here

Upvotes: 3

Views: 888

Answers (5)

Nilanchala
Nilanchala

Reputation: 5941

It is a quite challenging job. However, I believe there is no direct API or way to determine the virtual Keyboard state. The only way is to override the setLayout() method and determine if the screen width and height has been changed. And also you need to check the GUI layouts of your screen.

Upvotes: 1

padawan
padawan

Reputation: 86

There is no way to do that with the same code. You need to divide your code in two. One of them handles 4.5 - 4.7. The other handles 4.7 and later.

You can add a keyboard listener to 4.7 (and later) code that should check whether the screen changes in a continuous thread. It is not good, but it can work.

Upvotes: 2

Michael Donohue
Michael Donohue

Reputation: 11876

You have two choices. The first choice is better:

  • Figure out an invariant that works with the keyboard visible or hidden. The screen layout method is invoked when the visibility state of the keyboard changes, and the vertical size is reduced for a visible keyboard. If your invariants take advantage of that then you can just implement the logic in the screen layout method.
    In this case, I would suggest a layout method that always keeps the 'next' button at the bottom of the screen, and puts the username textbox in the center of the remaining space.

  • Use conditional compilation so you can write code that makes reference to the VirtualKeyboard class on OS 4.7+, and that code goes away in the older BlackBerry releases. 4 July: by conditional compilation, I mean use the BlackBerry preprocessor.

Upvotes: 2

Vivek Kumar Srivastava
Vivek Kumar Srivastava

Reputation: 2158

Set the VERTICAL_SCROLL style for the Manager which holds the EditField, or you can use a Screen with VERTICAL_SCROLL style. Doing this, the EditField automatically scrolls when the keyboard is displayed.

Use following class, maybe this is helpful for you:

class FocusableManager extends MainScreen implements FocusChangeListener
{
    private BasicEditField b;
    public FocusableManager() 
    {
        VerticalFieldManager vfm=new VerticalFieldManager(VERTICAL_SCROLL);
        vfm.add(new ButtonField("first"));
        b=new BasicEditField();
        b.setFocusListener(this);
        vfm.add(b);
        vfm.add(new ButtonField("second"));
        vfm.setMargin(250,0,0,0);
        add(vfm);
    }
    public void focusChanged(Field field, int eventType)
    {
        if(field==b)
        {
            if(eventType==1)//when edit field gain focus
            {
                VirtualKeyboard virtKbd;
                virtKbd =  getScreen().getVirtualKeyboard();
                virtKbd.setVisibility(VirtualKeyboard.SHOW_FORCE);
            }
            else if(eventType==3)//when edit field lost focus
            {
                VirtualKeyboard virtKbd;
                virtKbd =  getScreen().getVirtualKeyboard();
                virtKbd.setVisibility(VirtualKeyboard.HIDE_FORCE);
            }
        }
    }
}

Upvotes: 0

MishaZ
MishaZ

Reputation: 509

There is no event for this, but you can determine current state of virtual keyboard and set required state. For example hide it

    if(VirtualKeyboard.isSupported() == true){
        VirtualKeyboard keyboard = getVirtualKeyboard();

        if(keyboard != null)
            keyboard.setVisibility(VirtualKeyboard.HIDE);
    }

Upvotes: 1

Related Questions