2011-02-25 132 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