Tuesday, February 14, 2012

How to refresh BlackBerry ui page on button click?


I may seem ignorant but I have not found much information about how to go about my problem developing my BlackBerry application.



Basically I have constructed a UI that contains a few image buttons. What I want to do is when I click on one of the buttons, I want an image at the center of the screen to switch seemlessly to another image.



I am currently not using any threads though from what I've gathered I need to?



Or do I simply have to push a new screen in my button listener and recall the class's constructor and rebuild the page with different images?



Sorry if this is unclear, I would really appreciate some basic info on how to do this or a link that explains page refreshing in detail for blackberry!



Thanks alot



EDIT : Okay here is a very small part of my code :



This is basically the last thing I have tried in the listeners, I dont know how to change the image (flagField) when I press one of the two buttons! The only thing that worked for me was pushScreen(new Csps("americanflag")); every time I would press on a button, but the performance was bad and I was left with a stack of screens, not ideal.



I have been trying to do this all day long hehe... sigh , here goes:




public class CSP extends UiApplication
{
public static void main(String[] args)
{
CSP theApp = new CSP();
theApp.enterEventDispatcher();
}

public CSP()
{
CSPS csps = new CSPS();
pushScreen(csps);
}
}

class CSPS extends MainScreen implements FieldChangeListener
{

int width = Display.getWidth();
int height = Display.getHeight();

ButtonField backButton;

ImageButtonField canadianFlag;
ImageButtonField americanFlag;
Bitmap changeableFlag;
String currentFlag ="canada_flag.png";
BitmapField flagField;

canadianFlag = construct("canada_flag.png", 0.18);
americanFlag = construct("us.gif", 0.18);

canadianFlag.setChangeListener(this);
americanFlag.setChangeListener(this);

add(flagField);
add(canadianFlag);
add(americanFlag);
//LISTENERS
public void fieldChanged(Field field, int context){


if(field == canadianFlag){
setCurrentFlagResource("canada_flag.png");
BitmapField newFlagField = populateFlagField(currentFlag, 0.3);
replace(flagField, newFlagField);

this.invalidate();
this.doPaint();
this.updateDisplay();

}
else if(field == americanFlag){

setCurrentFlagResource("american-flag.gif");
BitmapField newFlagField = populateFlagField(currentFlag, 0.3);
replace(flagField, newFlagField);

this.invalidate();
this.doPaint();
this.updateDisplay();

}



the setCurrentFlagRessource method sets the flagField attribute to the appropriate BitmapField

3 comments:

  1. There is a method called setBitmap() in the BitmapField.

    In the listeners you should simply call flagField.setBitmap(newbitmap). You can also use the method setImage(). There is no need to call invalidate, updateUI etc.

    If you get any IllegalStateException while using this method, simply get a lock on the Applicaton Event lock object or invokeLater() this code.

    ReplyDelete
  2. You will only need to use threads if you are getting your images from some place that might block (like a web server). You should only need to update the images, though you may need to call invalidate() on your button or screen. What would really help is some information on what you are doing. You didn't even tell us what class you're using to display the image, if you've extended it or not, etc.

    ReplyDelete
  3. I don't know what you are doing in your code; But The way of refresh the screen is not like that;

    So, I change Your CSPS screen which you are trying to refresh the screen; See the below code...

    class CSPS extends MainScreen implements FieldChangeListener
    {

    int width = Display.getWidth();
    int height = Display.getHeight();

    ButtonField backButton;

    //ImageButtonField canadianFlag;
    //ImageButtonField americanFlag;
    Bitmap changeableFlag;
    String currentFlag ="canada_flag.png";
    BitmapField flagField;
    public CSPS()
    {
    createGUI();
    }

    public void createGUI()
    {
    canadianFlag = construct("canada_flag.png", 0.18);
    americanFlag = construct("us.gif", 0.18);

    canadianFlag.setChangeListener(this);
    americanFlag.setChangeListener(this);

    add(flagField);
    add(canadianFlag);
    add(americanFlag);
    //LISTENERS
    }

    public void fieldChanged(Field field, int context){


    if(field == canadianFlag)
    {
    setCurrentFlagResource("canada_flag.png");
    BitmapField newFlagField = populateFlagField(currentFlag, 0.3);
    replace(flagField, newFlagField);

    deleteAll();
    createGUI();
    invalidate();
    }
    else if(field == americanFlag)
    {
    setCurrentFlagResource("american-flag.gif");
    BitmapField newFlagField = populateFlagField(currentFlag, 0.3);
    replace(flagField, newFlagField);

    deleteAll();
    createGUI();
    invalidate();
    }
    }
    }




    Construct a createGUI() method, in that write the code that what you have to design for that screen. Not only this screen; What ever you are creating do like this;
    and



    deleteAll();
    createGUI();
    invalidate();




    For refresh the screen do the above three lines; delete all the fields and call again the createGUI() method; and at last invalidate();

    ReplyDelete