2011-02-25 134 views
0

标题可能不是很描述导航,但我想不出一个更好的。如何在一个圆圈

的问题是如下: 我有一个屏幕(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; 
    } 
} 
+0

你能张贴代码吗? – mellamokb 2011-02-25 16:24:04

回答

0

在你ScreenProvider你不需要进行屏幕截图1 /屏蔽2静态的 - 它们是单实例的成员。

的,其他问题我在当前的版本中看到外面是,你将要推一个屏幕到堆栈 - 这是已经在堆栈中。先尝试弹出之前的屏幕。

+0

我添加了一个弹出前一个屏幕的方式,但它仍然不起作用 – 2011-02-25 17:33:27

0

溢出错误可能是由来自ScreenOne和ScreenTwo不断跳跃一个无限循环的结果。你能描述一下你实际想要完成什么和/或展示一小段代码吗?

+0

我也想过这个,但是把屏幕写成单身也没有帮助。 (将发布更多的代码)这个星座的目的是,我希望我实现一种“标签视图”,我需要在特定的“标签”之间导航 – 2011-02-25 16:27:57

+0

添加了其他版本,试图避免创建一个新的对象时点击链接。 – 2011-02-25 16:39:23

2

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

+0

新版本如何(更改发布的代码)? – 2011-02-25 16:40:19

+0

我不明白为什么这个不起作用。请发布异常的堆栈跟踪,并告诉我们哪一行代码与堆栈跟踪中的哪一行相对应。 – 2011-02-25 16:41:55

+0

我无法进行调试,因此我认为无法获取StackTrace:( – 2011-02-25 17:32:41

1

关于修订5这个问题的

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

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

关于修改这个问题的4

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

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

+0

你可以解释一下更详细的或者发布一个例子,我不太清楚你的意思... – 2011-02-25 19:50:18

+0

我改编了上面的代码(仍然不工作),这是你的意思吗? – 2011-02-25 19:58:07

+0

**修订版本6 **另一个尝试。我现在分开了构建和循环设置。现在单击ScreenTwo上的链接给我一个RuntimeException。 – 2011-02-25 21:59:28