Как обновить страницу BlackBerry UI по нажатию кнопки? - PullRequest
0 голосов
/ 10 февраля 2012

Я могу показаться невежественным, но я не нашел много информации о том, как решить мою проблему при разработке моего приложения BlackBerry.

По сути, я создал пользовательский интерфейс, содержащий несколько кнопок изображений.Что я хочу сделать, так это когда я нажимаю на одну из кнопок, я хочу, чтобы изображение в центре экрана без видимых переключений переходило на другое изображение.

В настоящее время я не использую какие-либо темы, хотя из того, что я собрал, мне нужно?

Или мне просто нужно нажать новый экран в моем приемнике кнопок и вызвать конструктор класса и перестроить страницу с различными изображениями?

Извините, если это неясно, я был бы очень признателен за некоторыеОсновная информация о том, как это сделать, или ссылка, которая объясняет подробное обновление страницы для Blackberry!

Большое спасибо

РЕДАКТИРОВАТЬ: Хорошо, вот очень маленькая часть моего кода:

Это в основном последнее, что я пробовал в слушателях, я не знаю, как изменить изображение (flagField), когда я нажимаю одну из двух кнопок!Единственная вещь, которая работала для меня, была pushScreen (новый Csps ("americanflag"));каждый раз, когда я нажимал на кнопку, но производительность была плохой, и у меня оставалась куча экранов, а не идеально.

Я пытался делать это целый день, хе-хе ... вздох, здесьидет:

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();

    }

метод setCurrentFlagRessource устанавливает атрибут flagField для соответствующего BitmapField

Ответы [ 3 ]

2 голосов
/ 12 февраля 2012

В BitmapField.

есть метод с именем setBitmap().

В слушателях вы должны просто позвонить flagField.setBitmap(newbitmap). Вы также можете использовать метод setImage(). Нет необходимости звонить invalidate(), обновить UI и т. Д.

Если вы получаете IllegalStateException при использовании этого метода, просто получите блокировку объекта блокировки Applicaton Event или invokeLater () этот код.

1 голос
/ 10 февраля 2012

Вам понадобится использовать потоки только в том случае, если вы получаете изображения из какого-либо места, которое может блокироваться (например, веб-сервер). Вам нужно только обновить изображения, хотя вам может потребоваться вызвать invalidate () на вашей кнопке или экране. Что действительно поможет, так это некоторая информация о том, что вы делаете. Вы даже не сказали нам, какой класс вы используете для отображения изображения, если вы его расширили или нет, и т. Д.

0 голосов
/ 11 февраля 2012

Я не знаю, что вы делаете в своем коде;Но способ обновления экрана не такой:

Итак, я изменяю Ваш 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;
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();   
    }
}
}
  1. Создайте метод createGUI () , в котором напишите код, разработанный для этого экрана.Не только этот экран;Все, что вы создаете, делает так;и
deleteAll();
createGUI();
invalidate();
  1. Для обновления экрана выполните три вышеуказанные строки; удалить все поля и снова вызвать метод createGUI () ;и наконец invalidate ();
...