В J2ME, как я могу получить ссылку на все элементы управления формы для записи изменений состояния элементов управления формы?

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

Например, среди всех 5-6 элементов управления формы, если пользователь вводит 1-2 текстовых поля и пытается отменить форму, не сохраняя введенные данные в базу данных. Затем должно появиться окно предупреждения с сообщением «Сохранить изменения?». командой Yes, No.

Как это сделать?


Это мой код, который не дает желаемого результата:

import javax.microedition.lcdui.*;

import javax.microedition.midlet.*;
public class InformAboutStatechange extends MIDlet implements CommandListener
{
  Display d;
  Form frm;
  Command Save, Cancel, CancelAlrtYes, CancelAlrtNo, CancelAlrtBack;
  TextField Name, Age;
  Alert CancelAlrt;
  boolean StateChange = false;

  public InformAboutStatechange()
  {
    d = Display.getDisplay(this);
    frm = new Form("");
    Save = new Command("Save", Command.SCREEN, 1);
    Cancel = new Command("Cancel", Command.CANCEL, 2);
    Name = new TextField("Name", "", 10, 0);
    Age = new TextField("Age", "", 10, 0);
    frm.addCommand(Save);
    frm.addCommand(Cancel);
    frm.append(Name);
    frm.append(Age);
    frm.setCommandListener(this);
    d.setCurrent(frm);
  }
  public void startApp() 
  {
  }

  public void pauseApp() 
  {
  }

  public void destroyApp(boolean unconditional) 
  {
  }

  public void commandAction(Command c, Displayable dispable) 
  {
    if (c == Cancel) {
      CancelAlrt = new Alert("Application Alert","Save Changes???",null,null);
      CancelAlrtYes = new Command("Yes",Command.SCREEN, 1);
      CancelAlrtNo = new Command("No", Command.SCREEN | Command.CANCEL, 2);
      CancelAlrtBack = new Command("Back", Command.BACK, 3);
      CancelAlrt.addCommand(CancelAlrtYes);
      CancelAlrt.addCommand(CancelAlrtNo);
      CancelAlrt.addCommand(CancelAlrtBack);
      frm.setItemStateListener(new ItemStateListener() 
      {
        public void itemStateChanged(Item item) 
        {
          item.notifyStateChanged();
          if (item == Name) {
            if (item == Age) {
              StateChange = true;
            } else {
              StateChange = false;
            }
          }
        }
      });

      if (StateChange == true) {
        d.setCurrent(CancelAlrt);
        CancelAlrt.setCommandListener(new CommandListener() 
        {
            public void commandAction(Command cmd, Displayable dispable) 
            {
              if (cmd == CancelAlrtYes) {
                d.setCurrent(frm);
              } else if (cmd == CancelAlrtNo) {
                d.setCurrent(frm);
              } else if (cmd == CancelAlrtBack) {
                d.setCurrent(frm);
              }
            }
        });
      } else {
        destroyApp(true);
        notifyDestroyed();
      }
    }   
  }
}

person Rahul More    schedule 20.12.2012    source источник
comment
пожалуйста, опубликуйте фрагмент кода, который вы используете для 5-6 элементов управления формы... 1-2 текстовых поля (текстовые поля?) - без этого трудно сказать, что вам нужно   -  person gnat    schedule 21.12.2012


Ответы (1)


Ваша ошибка вызывает setItemStateListener слишком поздно.

В вашем фрагменте кода прослушиватель установлен в методе commandAction, который, в свою очередь, вызывается только тогда, когда пользователь нажимает командную кнопку. На данный момент слишком поздно начинать «слушать», и все изменения, которые вы хотели бы отслеживать, уже потеряны.

Для ваших целей прослушиватель состояния элемента должен быть установлен до отображения формы (т.е. до вызова d.setCurrent), как в примере ниже:

    // ...
    frm.setCommandListener(this);
    // ---> set item state listener here
    frm.setItemStateListener(new ItemStateListener() 
    {
      public void itemStateChanged(Item item) 
      {
        item.notifyStateChanged();
        if (item == Name) {
          if (item == Age) {
            StateChange = true;
          } else {
            StateChange = false;
          }
        }
      }
    });
    d.setCurrent(frm);
    // ...

Я бы также переместил код из конструктора InformAboutStatechange в метод startApp, как описано, например, в учебнике Жизненный цикл мидлета -> Состояния выполнения:

Конструктор обычно почти не инициализируется или вообще не инициализируется... Как правило, вы будете использовать startApp() для выделения хранилищ записей, сетевых подключений, компонентов пользовательского интерфейса и тому подобного...

person gnat    schedule 27.12.2012