如何在一个圆圈
标题可能不是很描述导航,但我想不出一个更好的。如何在一个圆圈
的问题是如下: 我有一个屏幕(ScreenOne)以链接到另一屏幕(ScreenTwo)。 ScreenTwo是一个返回到ScreenOne的链接。
我通过自定义RichTextFields和自定义ChangeListener实现这一点。
现在的问题是,我总是收到的*Error! 有什么方法来回导航吗?
问候亚光
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;
}
}
在你ScreenProvider你不需要进行屏幕截图1 /屏蔽2静态的 - 它们是单实例的成员。
的,其他问题我在当前的版本中看到外面是,你将要推一个屏幕到堆栈 - 这是已经在堆栈中。先尝试弹出之前的屏幕。
我添加了一个弹出前一个屏幕的方式,但它仍然不起作用 – 2011-02-25 17:33:27
溢出错误可能是由来自ScreenOne和ScreenTwo不断跳跃一个无限循环的结果。你能描述一下你实际想要完成什么和/或展示一小段代码吗?
我也想过这个,但是把屏幕写成单身也没有帮助。 (将发布更多的代码)这个星座的目的是,我希望我实现一种“标签视图”,我需要在特定的“标签”之间导航 – 2011-02-25 16:27:57
添加了其他版本,试图避免创建一个新的对象时点击链接。 – 2011-02-25 16:39:23
ScreenOne的构造函数创建一个ScreenTwo实例,并ScreenTwo的构造函数创建一个ScreenOne实例。你在这里有一个无限循环。
新版本如何(更改发布的代码)? – 2011-02-25 16:40:19
我不明白为什么这个不起作用。请发布异常的堆栈跟踪,并告诉我们哪一行代码与堆栈跟踪中的哪一行相对应。 – 2011-02-25 16:41:55
我无法进行调试,因此我认为无法获取StackTrace:( – 2011-02-25 17:32:41
关于修订5这个问题的:
新ScreenProvider() - >新ScreenOne() - > ScreenProvider.getInstance() - >新ScreenProvider() - > ...
仍然无限。同样,问题在于你正试图通过对象构造函数来设置一个循环。您需要先创建对象,然后分配下一个和上一个。
关于修改这个问题的4:
getScreenOne() - >新ScreenOne() - > getScreenTwo() - >新ScreenTwo() - > getScreenOne() - > newScreenOne() - > ...
你仍然有一个无限循环,因为构造函数试图存储彼此的一个实例。您需要先构造对象,然后添加循环引用。
你可以解释一下更详细的或者发布一个例子,我不太清楚你的意思... – 2011-02-25 19:50:18
我改编了上面的代码(仍然不工作),这是你的意思吗? – 2011-02-25 19:58:07
**修订版本6 **另一个尝试。我现在分开了构建和循环设置。现在单击ScreenTwo上的链接给我一个RuntimeException。 – 2011-02-25 21:59:28
你能张贴代码吗? – mellamokb 2011-02-25 16:24:04