安卓-Libgdx,如何在按钮点击后游戏启动后调用另一个活动界面

11

当我需要在游戏开始后通过单击按钮调用另一个活动时,我遇到了一个重大问题。通过AndroidApplication接口的initiate(game,)方法调用Game。

在普通Activity中,我可以轻松地调用另一个Activity,但似乎很难从实现AndroidApplication的Libgdx类中调用另一个Activity。

有人能建议一种适当的方法来从实现AndroidApplication接口的Libgdx类中调用Activity吗?

我已经尝试了一个星期,但似乎我的方法完全错误。

提前致谢。

1个回答

19

在你的LibGdx类中定义一个回调接口,然后使用它通知你的AndroidLauncher启动新的活动。

例如,在你的LibGdx游戏类中:

// Your Game class in the core package
public class MyGame extends Game {

    // Define an interface for your various callbacks to the android launcher
    public interface MyGameCallback {
        public void onStartActivityA();
        public void onStartActivityB();
        public void onStartSomeActivity(int someParameter, String someOtherParameter);
    }

    // Local variable to hold the callback implementation
    private MyGameCallback myGameCallback;

    // ** Additional **
    // Setter for the callback
    public void setMyGameCallback(MyGameCallback callback) {
        myGameCallback = callback;
    }

    @Override
    public void create () {
        ...
    }

    ...

    private void someMethod() {
        ...
        // check the calling class has actually implemented MyGameCallback
        if (myGameCallback != null) {

            // initiate which ever callback method you need.
            if (someCondition) {
                myGameCallback.onStartActivityA();
            } else if (someOtherCondition) {
                myGameCallback.onStartActivityB();
            } else {
                myGameCallback.onStartSomeActivity(someInteger, someString);
            }

        } else {
            Log.e("MyGame", "To use this class you must implement MyGameCallback!")
        }
    }
}

然后确保你的AndroidLauncher实现了所需的接口:

// Your AndroidLauncher
public class AndroidLauncher extends AndroidApplication implements MyGame.MyGameCallback {

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();

        // create an instance of MyGame, and set the callback
        MyGame myGame = new MyGame;
        // Since AndroidLauncher implements MyGame.MyGameCallback, we can just pass 'this' to the callback setter.
        myGame.setMyGameCallback(this);

        initialize(myGame, config);
    }

    @Override
    public void onStartActivityA() {
        Intent intent = new Intent(this, ActivityA.class);
        startActivity(intent);
    }

    @Override
    public void onStartActivityB(){
        Intent intent = new Intent(this, ActivityB.class);
        startActivity(intent);
    }

    @Override
    public void onStartSomeActivity(int someParameter, String someOtherParameter){
        Intent intent = new Intent(this, ActivityA.class);

        // do whatever you want with the supplied parameters.
        if (someParameter == 42) {
            intent.putExtra(MY_EXTRA, someOtherParameter);
        }
        startActivity(intent);
    }

}

谢谢您的建议。看起来它会起作用,但需要尝试使用您的建议。此外,我可以问一下为什么在这种情况下需要一个接口吗?我将非常感激您的回复 :) - denden130
我尝试使用它,但在MyGame SomeMethod() myGameCallback.onStartActivityA();处出现了NullPointerException。原来myGameCallback是null。我应该如何初始化它? - denden130
1
哎呀,对不起,我忘记指定了。你只需添加一个setter即可。我会更新我的答案以显示这一点。 - Sound Conception
我认为您忘记将 myGameCallback 变量更改为 static,这样每次调用 someMethod 时它都不会覆盖变量的值,从而避免了 nullpointer 异常。 - Ricardo D. Ferrancullo III
谢谢你 @SoundConception。 你刚刚救了我的一天 :) - mchouhan_google

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接