标题可能不是很具描述性,但我想不出更好的标题。
问题如下: 我有一个屏幕(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 :(得分: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设为静态 - 它们是单例实例的成员。
除此之外,我在当前版本中看到的另一个问题是,您将要将屏幕推入堆栈 - 这已经在堆栈中。首先尝试弹出前一个屏幕。