2014-09-26 10 views
11

Ho dovuto affrontare un problema grave quando ho bisogno di chiamare un'altra attività quando si fa clic sul pulsante dopo l'avvio del gioco. Il gioco viene chiamato tramite il metodo initiate (gioco,) dall'interfaccia AndroidApplication.Android-Libgdx, chiamata a un'altra attività dopo la partita inizia con il pulsante clic su

Nella normale attività, posso chiamare facilmente un'altra attività, ma sembra difficile chiamare un'altra attività dalla classe Libgdx che implementa AndroidApplication.

Qualcuno potrebbe suggerire un metodo corretto per chiamare l'attività dalla classe Libgdx che implementa l'interfaccia AndroidApplication?

Ho provato a fare questo per una settimana, ma sembra che il mio metodo è del tutto sbagliato ..

Grazie in anticipo.

risposta

17

Definire un'interfaccia di callback nella classe LibGdx e utilizzarla per notificare all'avvio di AndroidLauncher la nuova attività.

Per esempio nella classe LibGdx gioco:

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

Poi Assicuriamo il vostro AndroidLauncher implementa l'interfaccia desiderata:

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

Grazie per il suggerimento. Sembra che funzionerà, ma devi provare a utilizzare il tuo suggerimento. Inoltre, potrei chiedere perché è necessaria un'interfaccia in questo caso? Apprezzerò la tua risposta :) – denden130

+0

Ho provato ad usarlo ma ottengo NullPointerException su MyGame SomeMethod() myGameCallback.onStartActivityA(); . Si scopre che myGameCallback è nullo. Come dovrei inizializzarlo? – denden130

+1

Oops si, scusa, ho dimenticato di specificarlo. Puoi semplicemente aggiungere un setter. Aggiornerò la mia risposta per mostrarlo. –

Problemi correlati