如何在一个圆圈中导航

时间:2011-02-25 16:18:27

标签: java user-interface blackberry

标题可能不是很具描述性,但我想不出更好的标题。

问题如下: 我有一个屏幕(ScreenOne),其中包含指向另一个屏幕的链接(ScreenTwo)。 在ScreenTwo上是一个返回ScreenOne的链接。

我是通过自定义RichTextFields和自定义ChangeListener实现的。

现在的问题是我不断收到StackOverflowError! 有没有办法以这种方式来回导航?

关于亚光

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

    public MyApp()
    {
        ScreenOne so = ScreenProvider.getInstance().getScreenOne();
        so.initialize();
        ScreenProvider.getInstance().getScreenTwo().initialize();
        pushScreen(so);
    }    
}

public class ScreenOne extends MainScreen {
    MyTextField link;

    public ScreenOne() {
        link = new MyTextField("FirstScreen");
        add(link);
    }

    public void initialize(){
        link.setChangeListener((FieldChangeListener) new MyFieldChangeListener(ScreenProvider.getInstance().getScreenTwo()));
    }
}

public class ScreenTwo extends MainScreen {
    MyTextField link;

    public ScreenTwo() {
        link = new MyTextField("SecondScreen");
        add(link);
    }

    public void initialize(){
        link.setChangeListener((FieldChangeListener) new MyFieldChangeListener(ScreenProvider.getInstance().getScreenOne()));
    }
}

public class MyFieldChangeListener implements FieldChangeListener {

    private Screen nextScreen;

    public MyFieldChangeListener(Screen nextScreen) {
        this.nextScreen = nextScreen;
    }

    public void fieldChanged(Field field, int context) {
        UiApplication.getUiApplication().pushScreen(nextScreen);
    }
}

public class MyTextField extends RichTextField {
    public MyTextField() {
        super();
    }

    public MyTextField(String text) {
        super(text);
    }

    protected boolean touchEvent(TouchEvent message) {
        if (TouchEvent.CLICK == message.getEvent()) {
            FieldChangeListener listener = getChangeListener();
            if (null != listener)
                listener.fieldChanged(this, 1);
        }
        return super.touchEvent(message);
    }
}

public class ScreenProvider {
    private static ScreenProvider instance = null;

    private ScreenProvider(){}

    public static ScreenProvider getInstance() {
        if (instance == null) {
            instance = new ScreenProvider();
        }
        return instance;
    }

    private ScreenOne screenOne = new ScreenOne();
    private ScreenTwo screenTwo = new ScreenTwo();

    public ScreenOne getScreenOne() {
        return screenOne;
    }

    public ScreenTwo getScreenTwo() {
        return screenTwo;
    }
}

4 个答案:

答案 0 :(得分:2)

ScreenOne的构造函数创建一个ScreenTwo实例,ScreenTwo的构造函数创建一个ScreenOne实例。你在这里有一个无限循环。

答案 1 :(得分:1)

关于此问题的修订版5

  

new ScreenProvider() - >新的ScreenOne() - > ScreenProvider.getInstance() - >新的ScreenProvider() - > ...

仍然无限。同样,问题是您正在尝试通过对象构造函数设置循环。您需要先创建对象,然后分配下一个和上一个。

关于此问题的修订版4

  

getScreenOne() - >新的ScreenOne() - > getScreenTwo() - >新的ScreenTwo() - > getScreenOne() - > newScreenOne() - > ...

你仍然有一个无限循环,因为构造函数试图存储彼此的实例。您需要先构造对象,然后添加循环引用。

答案 2 :(得分:0)

溢出错误可能是由于不断从ScreenOne和ScreenTwo跳转而导致无限循环的结果。你能描述一下你实际想要完成的事情和/或显示一段代码吗?

答案 3 :(得分:0)

在ScreenProvider中,您不需要将screen1 / screen2设为静态 - 它们是单例实例的成员。

除此之外,我在当前版本中看到的另一个问题是,您将要将屏幕推入堆栈 - 这已经在堆栈中。首先尝试弹出前一个屏幕。

相关问题