【问题标题】:Blackberry: saving ListField content and dirty state management黑莓:保存 ListField 内容和脏状态管理
【发布时间】:2015-04-16 17:08:25
【问题描述】:

我准备了一个简单的测试用例来演示我的问题。

它只是一个在添加到新项目时会立即运行的文件。

我想要一个 MainScreen 显示可编辑的项目列表:

当离开这个屏幕时,应该询问用户——她是否想通过标准的保存/放弃/取消对话框将修改后的列表保存到永久存储中:

我已将 setDirty(true) 添加到我的菜单项中,并且标准对话框确实出现了。

我的问题是:我不知道如何在保存后清除脏标志 - 在我当前的代码中,保存/丢弃/取消对话框一次又一次出现,即使我只是查看ListField,无需编辑。

src\mypackage\MyList.java:

package mypackage;

import java.util.*;
import net.rim.device.api.collection.*;
import net.rim.device.api.collection.util.*; 
import net.rim.device.api.system.*;
import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.container.*;
import net.rim.device.api.ui.decor.*;
import net.rim.device.api.util.*;

public class MyList extends UiApplication implements FieldChangeListener {
    MyScreen myScreen = new MyScreen();

    public static void main(String args[]) {
        MyList app = new MyList();
        app.enterEventDispatcher();
    }

    public MyList() {
        MainScreen titleScreen = new MainScreen();
        titleScreen.setTitle("Click the button:");

        ButtonField myButton = new ButtonField("Show the list", ButtonField.CONSUME_CLICK) ;
        myButton.setChangeListener(this);
        titleScreen.add(myButton);

        pushScreen(titleScreen);
    }

    public void fieldChanged(Field field, int context) {
        pushScreen(myScreen);
    }
} 

class MyScreen extends MainScreen {
    ObjectListField myList = new ObjectListField();
    static PersistentObject myStore;
    static Vector myData;

    static {
        myStore = PersistentStore.getPersistentObject(0xb77f8e453754f37aL);
        myData = (Vector) myStore.getContents();
        if (myData == null) {
                myData = new Vector();
                myData.addElement("String 1");
                myData.addElement("String 2");
                myData.addElement("String 3");
                myStore.setContents(myData);
        }
    }

    public MyScreen() {
        setTitle("Edit the list below:");

        add(myList);

        addMenuItem(addItem);
        addMenuItem(editItem);
        addMenuItem(removeItem);
    }

    // load data from persistent store into the ListField
    private void loadData() {
        // clear the ListField
        myList.setSize(0);
        // copy data from the Vector to the ListField
        for (int i = myData.size() - 1; i >= 0; i--)
            myList.insert(0, myData.elementAt(i));
    }

    // save data from the ListField into the persistent store
    private void saveData() {
        // clear the Vector
        myData.removeAllElements();
        // copy data from the ListField to the Vector
        for (int i = myList.getSize() - 1; i >=0; i--)
            myData.addElement(myList.get(myList, i));

        synchronized(PersistentStore.getSynchObject()) {
            myStore.commit();
        }
    }

    protected void onUiEngineAttached(boolean attached) {
        if (attached) {
            loadData();
        }
    }

    public void save() {
        saveData();
        // UPDATE: when I call setDirty(false); here, then
        // the app starts displaying Save/Discard/Cancel dialog
        // on its exit - so there must be a better way...
    }

    private final MenuItem addItem = new MenuItem("Add Item", 0, 0) {  
        public void run() { 
            String[] buttons = {"Add", "Cancel"};
            Dialog myDialog = new Dialog("Add Item", buttons, null, 0, null);

            EditField myEdit = new EditField("Item: ", "");
            myDialog.add(myEdit);

            if (myDialog.doModal() == 0) {
                myList.insert(0, myEdit.getText());
                setDirty(true);
            }
        }
    };

    private final MenuItem editItem = new MenuItem("Edit Item", 0, 0) {  
        public void run() { 
            String[] buttons = {"Save", "Cancel"};
            Dialog myDialog = new Dialog("Edit Item", buttons, null, 0, null);

            int index = myList.getSelectedIndex();
            if (index == -1) {
                return;
            }

            String selectedItem = (String) myList.get(myList, index);
            EditField myEdit = new EditField("Item: ", selectedItem);
            myDialog.add(myEdit);

            if (myDialog.doModal() == 0) {
                myList.set(index, myEdit.getText());
                setDirty(true);
            }
        }
    };

    private final MenuItem removeItem = new MenuItem("Remove Item", 0, 0) {  
        public void run() { 
            String[] buttons = {"Delete", "Cancel"};
            Dialog myDialog = new Dialog("Remove Item", buttons, null, 0, null);

            int index = myList.getSelectedIndex();
            if (index == -1) {
                return;
            }

            String selectedItem = (String) myList.get(myList, index);
            LabelField myLabel = new LabelField("Really delete " + selectedItem + "?");
            myDialog.add(myLabel);

            if (myDialog.doModal() == 0) {
                myList.delete(index);
                setDirty(true);
            }
        }
    };
}

请分享您的 Blackberry 6 经验,也欢迎有关持久存储的建议。

在我的实际程序中,我使用的是KeywordFilterField for viewing a SortedReadableList,所以从阅读黑莓文档我想,我必须始终在 SortedReadableList 和 Vector 之间复制数据 - 因为后者是可持久的,而前者不是?

【问题讨论】:

  • 没有一个保存调用被命中的问题吗?
  • 抱歉,我已更新我的问题以使其更清楚。我的问题是(虽然代码大部分工作正常)保存/丢弃/取消对话框一次又一次出现 - 即使我不编辑列表。
  • 嗯.. 我不复制这个。在屏幕构造函数中添加列表以及在onUiEngineAttached 中加载其内容不会使屏幕变脏。所以在退出时我没有得到保存/丢弃/取消对话框(因为屏幕保持不脏)。而且由于我没有得到对话框,因此不会调用save(),因此我是否更改save() 中的脏状态并不重要。所以问题是“当你不编辑列表时,是什么让你的屏幕变脏了?”

标签: blackberry persistent listfield


【解决方案1】:

setDirty(false) 将清除脏标志,如果这是你所追求的。

【讨论】:

  • 谢谢,但是当我将 setDirty(false) 放入 saveData() 时,应用程序开始在退出时显示 Save/Discard/Cancel-dialog。
  • 这可能是因为在调用保存数据时,程序已经完成了决定是否需要保存并提示用户的逻辑。如果您想避免该弹出窗口,则必须在用户退出屏幕之前清除标志。
  • 谢谢,我发现了我真正的问题:我在 MainScreen 标题区域中有 KeywordFilterField,因此当 Screen.onClose() 查找任何字段是否脏时,它的脏位会被忽略。我引入了自己的 _dirty 变量并编写了自己的 onClose() 处理程序来解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多