Можно ли повторно показать последнюю открытую форму, когда мидлет был приостановлен?

Приложение запущено, пользователь вносит некоторые TextField изменения. Затем поступает вызов, поэтому MIDlet переходит в состояние paused. Когда диалог завершен, приложение перезапускается, вызывается startApp() метод MIDlet и отображается main Form приложения!

Итак, как отменить это поведение по умолчанию, чтобы сохранить последний открытый Form со всеми изменениями?


person pheromix    schedule 20.12.2011    source источник
comment
Отобразить текущую форму в PauseApp()   -  person Lucifer    schedule 20.12.2011
comment
Это не работает: я создаю в мидлете public static com.sun.lwuit.Form lastForm = null; и в конструкторе формы делаю: myMidlet.lastForm = this;. Затем в коде pauseApp() я: lastForm.showBack(); но всегда отображается основная форма! Последняя форма отображается всего за долю секунды, но затем открывается основная форма!   -  person pheromix    schedule 20.12.2011
comment
Вы проверяли это с помощью простых форм lcdui вместо тех, которые предоставляет lwuit?   -  person gnat    schedule 20.12.2011
comment
99% моих Форм — это львуит Формы, в проекте всего один холст.   -  person pheromix    schedule 20.12.2011


Ответы (2)


Я создал static Form в классе MIDlet:

public static Form lastForm = null;

Затем я установил фактическую форму в каждой форме моего project :

if (!myMidlet.lastCanvas.isEmpty())
    myMidlet.lastCanvas.clear();    
myMidlet.lastForm = this;

Затем в startApp() я написал:

public void startApp() {
        ...
        if (lastForm != null)
            lastForm.showBack();
        else
        {
            new MainForm(this).show();
        }
    }

ИЗМЕНИТЬ:

Для полотна:

В классе MIDlet:

public static Hashtable lastCanvas = new Hashtable();

В классе canvas (конструкторе):

if (myMidlet.lastForm != null)
    myMidlet.lastForm = null;

if (!myMidlet.lastCanvas.isEmpty())
    myMidlet.lastCanvas.clear();

myMidlet.lastCanvas.put(new String("Form"), this);

И в startApp() :

public void startApp() {
        VKBImplementationFactory.init();
        Display.init(this);
        if (lastForm != null)
            lastForm.showBack();
        else if (!lastCanvas.isEmpty())
        {
            javax.microedition.lcdui.Display.getDisplay(this).setCurrent((Canvas)lastCanvas.get(new String("Form")));
        }
        else
            new MainForm(this).show();
    }

Я думаю, что этот подход с использованием HashTable будет работать даже для любой lcdui формы.

person pheromix    schedule 20.12.2011
comment
если вы замените форму отображаемым, он также будет охватывать холст: public static Displayable lastDisplayable = null; //... - при условии, что методы showBack и show применимы к отображаемому - person gnat; 20.12.2011
comment
к сожалению, эти методы применимы только к LWUIT. См. редактирование моего ответа для холста, возможно, форма lcdui также может быть применена к новому методу. - person pheromix; 20.12.2011

В LWUIT я использую это

import com.sun.lwuit.Display;
......
......
......

public void startApp() {
    if (Display.isInitialized()) {
        if (Display.getInstance().isMinimized()) {
            Display.getInstance().getCurrent().showBack();
        }
    } else {
        //your normal initialization code.
    }
}
person Akintayo Olusegun    schedule 05.01.2012