[英]How to navigate in a circle
標題可能不是很描述,但我想不到更好的標題。
問題如下:我有一個屏幕(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;
}
}
ScreenOne的構造函數創建一個ScreenTwo實例,而ScreenTwo的構造函數創建一個ScreenOne實例。 您在這里有一個無限循環。
關於該問題的修訂版5 :
new ScreenProvider()-> new ScreenOne()-> ScreenProvider.getInstance()-> new ScreenProvider()-> ...
仍然無限。 同樣,問題是您試圖通過對象構造函數設置周期。 您需要先創建對象,然后分配下一個和上一個。
關於此問題的修訂版4 :
getScreenOne()->新ScreenOne()-> getScreenTwo()->新ScreenTwo()-> getScreenOne()-> newScreenOne()-> ...
您仍然有一個無限循環,因為構造函數試圖存儲彼此的實例。 您需要先構造對象,然后添加循環引用。
該溢出錯誤可能是由於不斷從ScreenOne和ScreenTwo跳轉而導致的無限循環的結果。 您能描述一下您實際想要完成的工作和/或顯示一段代碼嗎?
在ScreenProvider中,您無需將screen1 / screen2設為靜態-它們是單例實例的成員。
除此以外,我在當前版本中看到的另一個問題是您將把屏幕推到堆棧上-已經在堆棧上了。 嘗試先彈出先前的屏幕。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.