我们正在使用 libgdx 为 Android 设备制作游戏原型(prototype)。对于屏幕管理,我们使用带有屏幕名称的枚举来获取 ScreenManager 类的抽象层。因此,您可以执行以下操作来显示新屏幕并隐藏旧屏幕:ScreenManager.getInstance().show( Screens.LOGIN );
现在我们想使用设备的后退按钮跳回屏幕或退出应用程序。因此,我们想在每个枚举值中创建一个字段来声明parentScreen,并在按下后退按钮时使用它。不幸的是,不可能在其内部使用枚举自己的字段,我们收到以下错误:Cannot refer to the static enum field Screens.LOGIN within an initializer
上protected Screens parentScreen = Screens.LOGIN;
。也许有人知道如何解决这个问题。
这是实际的枚举:
/**
* Used to hide actual implementations of Screen interface and expose only "pointer objects".
* All of them are declared with package-private class modifier.
*/
public enum Screens {
SPLASH {
@Override
protected Screen getScreenInstance( MyGdxGame game ) {
return new SplashScreen( game );
}
},
LOGIN {
@Override
protected Screen getScreenInstance( MyGdxGame game ) {
return new LoginScreen( game );
}
},
GAME {
protected Screens parentScreen = Screens.LOGIN;
@Override
protected Screen getScreenInstance( MyGdxGame game ) {
return new GameScreen( game );
}
},
CREDITS {
protected Screens parentScreen = Screens.LOGIN;
@Override
protected Screen getScreenInstance( MyGdxGame game ) {
return new CreditsScreen( game );
}
};
protected Screens parentScreen = null;
/** Every enum member musts override this method and it will be visible only inside the package */
protected abstract Screen getScreenInstance( MyGdxGame game );
}
此函数应显示父屏幕:
/**
* Execute when the user clicks the back button
* Default called by the AbstractScreen Class
*/
public void backButton() {
this.show( this.currentScreen.parentScreen );
}
感谢您提前提出的建议!
最佳答案
有多种可能性。我最喜欢的是使用构造函数,因为它的文本较少,但更容易阅读:
public enum Screens {
SPLASH(Screens.LOGIN) {
@Override
protected Screen getScreenInstance( MyGdxGame game ) {
return new SplashScreen( game );
}
},
LOGIN(null) {//...}
;//this semi-colon is expected after the enum values
private final Screens parentScreen;
Screens(Screens parent){//Constructor
parentScreen = parent;
}
public Screens getParentScreen(){
return parentScreen;
}
protected abstract Screen getScreenInstance( MyGdxGame game );
另一种解决方案是声明一个抽象方法 getParentScreen():
public enum Screens {
SPLASH {
@Override
protected Screen getScreenInstance( MyGdxGame game ) {
return new SplashScreen( game );
}
@Override
protected Screen getParentScreen() {
return Screens.LOGIN;
}
},
//...
;
protected abstract Screen getScreenInstance( MyGdxGame game );
protected abstract Screen getParentScreen();
关于Java - 在自身内部使用枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26059095/