2014-09-26 2 views
11

У меня возникла серьезная проблема, когда мне нужно вызвать другое действие при нажатии кнопки после запуска игры. Игра вызывается через метод initiate (game,) из интерфейса AndroidApplication.Android-Libgdx, вызывая другое действие после начала игры. Нажмите кнопку

В обычной деятельности я могу легко вызвать другое действие, но, похоже, сложно вызвать другое действие из класса Libgdx, которое реализует AndroidApplication.

Может ли кто-нибудь предложить правильный метод вызова Activity из класса Libgdx, который реализует интерфейс AndroidApplication?

Я попытался сделать это в течение недели, но мне кажется, что мой метод совершенно неправильно ..

Заранее спасибо.

ответ

17

Определите интерфейс обратного вызова в вашем классе 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); 
    } 

} 
+0

спасибо за предложение. Похоже, что это сработает, но нужно попробовать использовать свое предложение. Кроме того, могу ли я спросить, почему в этом случае необходим интерфейс? Я буду благодарен за ваш ответ :) – denden130

+0

Я пробовал использовать его, но я получаю исключение NullPointerException в MyGame SomeMethod() myGameCallback.onStartActivityA(); , Оказывается, myGameCallback имеет значение NULL. Как его инициализировать? – denden130

+1

К сожалению, я забыл указать это. Вы можете просто добавить сеттер. Я обновлю свой ответ, чтобы показать это. –

Смежные вопросы