2014-09-26 4 views
11

Ich hatte ein großes Problem, als ich eine andere Aktivität aufrufen musste, wenn nach dem Start des Spiels auf die Schaltfläche geklickt wurde. Das Spiel wird über die Methode initiate (game,) von der AndroidApplication-Schnittstelle aufgerufen.Android-Libgdx, Aufruf einer anderen Aktivität nach dem Start des Spiels Klicken Sie auf

In normalen Aktivität kann ich leicht die andere Aktivität aufrufen, aber es scheint schwierig zu sein, eine andere Aktivität von Libgdx-Klasse aufzurufen, die AndroidApplication implementiert.

Kann jemand eine geeignete Methode vorschlagen, um die Aktivität von Libgdx-Klasse aufzurufen, die AndroidApplication-Schnittstelle implementiert?

Ich habe versucht, dies für eine Woche zu tun, aber es scheint, dass meine Methode ist völlig falsch ..

Vielen Dank im Voraus.

Antwort

17

Definieren Sie eine Callback-Schnittstelle in Ihrer LibGdx-Klasse, und benachrichtigen Sie Ihren AndroidLauncher, um die neue Aktivität zu starten.

Zum Beispiel in Ihrer Libgdx Spielklasse:

// 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!") 
     } 
    } 
} 

Dann sichern Sie Ihre AndroidLauncher implementiert die erforderliche Schnittstelle:

// 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

Danke für die Anregung. Sieht so aus, als würde es funktionieren, aber versuchen Sie es mit Ihrem Vorschlag. Könnte ich außerdem fragen, warum in diesem Fall eine Schnittstelle notwendig ist? Ich werde Ihre Antwort zu schätzen :) – denden130

+0

Ich habe versucht, es zu verwenden, aber ich bekomme die NullPointerException am MyGame SomeMethod() myGameCallback.onStartActivityA(); . Es stellt sich heraus, dass myGameCallback null ist. Wie sollte ich es initialisieren? – denden130

+1

Hoppla, tut mir leid, das habe ich vergessen zu spezifizieren. Sie können einfach einen Setter hinzufügen. Ich werde meine Antwort aktualisieren, um dies zu zeigen. –

Verwandte Themen