当前位置: 首页 > 知识库问答 >
问题:

按下后退按钮后的libGDX Android白屏

方嘉言
2023-03-14

我对libGDX有一个问题,当我用后退按钮退出后恢复应用程序时,只有一个白色屏幕。

实际应用运行,接受触摸输入,播放声音,但屏幕只是白色。

我读过保持对纹理的静态引用可能会导致这个问题,但我没有这样做。

下面是我的资产代码如何工作的简化版本。

public class GdxGame extends Game {

    private Assets assets;

    @Override
    public void onCreate() {
        assets = new Asstes();
        assets.startLoading();

        /*
         *Within SplashScreen, GdxGame.getAssets() is accessed, and 
         *manager.update() is called
        */
        setScreen(new SplashScreen());
    }

    @Override
    public void dispose() {
        assets.dispose();
        assets = null;
    }

    //Perhaps a problem??
    public static Assets getAssets() {
        return ((GdxGame) Gdx.app.getApplicationListener()).assets;
    }
}

public class Assets implements Disposable{

    private AssetManager manager;

    public Assets() {
        manager = new AssetManager();
    }

    public void startLoading() {
        manager.load(....);
    }

    @Override
    public void dispose() {
        manager.dispose();
    }
}

在按下后退按钮后返回应用程序时,重新创建AssetManager,重新打开SplashScreen(为白色),并更新AssetManager直到重新加载所有资产(大约需要2秒)。

因此,当应用程序重新打开时,一个新的AssetManager正在加载所有必要的纹理,但由于某种原因,所有的纹理仍然是白色的。

这是否与我如何从UI和游戏类访问AssetManager有关?

//In GdxGame
public Assets getAssets() {
    return ((GdxGame) Gdx.app.getApplicationListener()).assets;
}

那是唯一一个我能看到有问题的地方,但即便如此,我也不明白那会有什么问题。

public class SplashScreen extends Screen {
    private Texture logo;
    private Assets assets;

    @Override
    public void show() {
        assets = GdxGame.getAssets();

        logo = new Texture(Gdx.files.internal("data/logo.png"));
    }

    @Override
    public void render(float delta) {
        super.render(float delta);

        if(assets.load()) {
            //Switch screens
        }

        //getBatch() is the same form as getAssets() ((GdxGame) Gdx.app.getApplicationListener()).batch)
        GdxGame.getBatch().draw(logo, 100, 100, 250, 250);
    }

    @Override
    public void hide() {
        super.hide();
        logo.dispose();
    }
}

共有1个答案

阚夕
2023-03-14

结果发现问题与我如何管理屏幕有关。我的GdxGame类中有一个方便的方法,允许我根据screentype枚举切换屏幕。

在枚举中,我将创建一个带有反射的新屏幕,给定该屏幕在枚举构造函数中的类。

问题是我将屏幕存储在枚举中,并且只创建了一次。这意味着我在按下“后退”后返回时保留并使用旧上下文中的屏幕。

为了解决这个问题,我只需更改它,以便每次访问枚举时都创建一个新屏幕,而不是在开始时存储一个屏幕。

 类似资料:
  • 我正在使用android导航组件库。我用导航图设置了两个片段。我想在我的片段内按下后退按钮时做一些额外的动作。 我使用这段代码来处理工具栏上的按钮点击,但我也想处理后退按钮按下。我该怎么做?

  • 我是一个新手,我正在尝试创建一个应用程序来在我的投资组合中使用。本质上,该程序是一个可以访问不同菜单的菜单(json文件:texas_pick.js,Breakth.js…),该程序旨在以按钮的形式显示菜单选项,按钮的详细信息从各自的json文件中检索。我面临的问题是,单击菜单选项时,会检索最后一个菜单项的数据。我将后端编程为只将商品名称和价格推送到数据库,而前端则检索这些数据并将其显示在表上。检

  • 这里发生的情况是,一旦按下后退按钮,活动就会重新加载,并再次按下后退按钮退出应用程序。我希望它是一次性的,即第一次 我尝试了很多方法,比如尝试onBackPressed方法,但都没有用。我想解决这个问题,当用户按下后退按钮时,他应该退出应用程序。同样的情况也发生在其他活动中,其中我有一个登录页面,一旦用户来到登录页面,如果他希望退出应用程序并按下后退按钮,那么在我的情况下,登录页面再次被重新加载,

  • 我正在编写一个使用ChessClock类的游戏应用程序。这两个运动员每人都有一个钟。时钟每十分之一秒向自己发送一个信息流,如果运行,则减少剩余时间。当时间到期时,时钟会调用父视图组中的一个方法,该方法会停止时钟并设置一个标志,该标志会导致忽略进一步的触摸事件,从而用户无法再移动工件。我正在用kotlin写作,但我认为java程序员也会明白这一点: 这可以正常工作,但是如果用户按下后退按钮然后开始一

  • 我正在开发一个Android应用程序,我设计了一个弹出窗口,通过替换活动中的软键盘来显示一些视图。popupWindow包含一个searchView。当我点击一个按钮时,它显示弹出窗口,软键盘被隐藏。现在,当popupWindow中的searchView获得焦点时,我调用该方法: PopupWindow.set聚焦(真) 显示键盘,以便用户可以在searchView中开始键入。当searchVie