簡體   English   中英

如何繞圈導航

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM