2010-10-12 4 views
227

Sono molto nuovo sullo sviluppo di Android.Avviare un'attività con un parametro

Voglio creare e avviare un'attività per mostrare informazioni su un gioco. Mostro quell'informazione ho bisogno di un gameId.

Come posso passare questo ID di gioco all'attività? L'ID del gioco è assolutamente necessario, quindi non voglio creare o avviare l'attività se non ha l'ID.

È come se l'attività avesse solo un costruttore con un parametro.

Come posso farlo?

Grazie.

risposta

398

Inserisci un int che è il tuo ID nel nuovo Intent.

Intent intent = new Intent(FirstActivity.this, SecondActivity.class); 
Bundle b = new Bundle(); 
b.putInt("key", 1); //Your id 
intent.putExtras(b); //Put your id to your next Intent 
startActivity(intent); 
finish(); 

poi prendete l'id della tua nuova Activity:

Bundle b = getIntent().getExtras(); 
int value = -1; // or other values 
if(b != null) 
    value = b.getInt("key"); 
+36

si consiglia per assicurarsi che b! = null prima di iniziare ad afferrare da esso – Andrew

+0

Come può "b" essere nullo nella seconda attività in questo codice? Ottengo b è nullo sul metodo di creazione della seconda attività. –

+2

B può essere nullo, diciamo che vuoi iniziare questa attività da un altro posto e lo fai in modo standard, senza parametri. Lancia un NPE.Si dovrebbe sempre considerare questo param opzionale. –

100

Basta aggiungere dati aggiuntivi l'intento di utilizzare per chiamare la vostra attività.

Nell'attività chiamante:

Intent i = new Intent(this, TheNextActivity.class); 
i.putExtra("id", id); 
startActivity(i); 

All'interno onCreate() dell'attività si chiama:

Bundle b = getIntent().getExtras(); 
int id = b.getInt("id"); 

Edit: Oops, Charlie Sheen è stato più veloce.

+1

va bene passare in un tipo di oggetto personalizzato? – Amyth

+1

@Amyth No, devi usare un pacchetto come nella risposta accettata. – AtlasRider

+0

Vedere questo @Amyth: http://stackoverflow.com/questions/14333449/passing-data-through-intent-using-serializable – Cold

3

Le risposte esistenti (passare i dati nello Intent passati a startActivity()) mostrano il modo normale per risolvere questo problema. Esiste un'altra soluzione che può essere utilizzata nel caso strano in cui si sta creando un'attività che verrà avviata da un'altra app (ad esempio, una delle attività di modifica in un plug-in Tasker) e pertanto non controllare lo Intent che avvia il Activity.

È possibile creare una classe base Activity che ha un costruttore con un parametro, quindi una classe derivata che ha un costruttore di default, che chiama il costruttore della classe base con un valore, come così:

class BaseActivity extends Activity 
{ 
    public BaseActivity(String param) 
    { 
     // Do something with param 
    } 
} 

class DerivedActivity extends BaseActivity 
{ 
    public DerivedActivity() 
    { 
     super("parameter"); 
    } 
} 

Se è necessario generare il parametro da passare al costruttore della classe base, è sufficiente sostituire il valore hardcoded con una chiamata di funzione che restituisce il valore corretto da passare.

31

mi piace farlo con un metodo statico nella seconda attività:

private static final String EXTRA_GAME_ID = "your.package.gameId"; 

public static void start(Context context, String gameId) { 
    Intent intent = new Intent(context, SecondActivity.class); 
    intent.putExtra(EXTRA_GAME_ID, gameId); 
    context.startActivity(intent); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    ... 
    Intent intent = this.getIntent(); 
    String gameId = intent.getStringExtra(EXTRA_GAME_ID); 
} 

Poi dalla prima attività (e per qualsiasi altro luogo), basta fare:

SecondActivity.start(this, "the.game.id"); 
+4

Ciò rende il mio codice più pulito. Grazie. –

+0

Davvero un bel codice. –

+0

Esattamente quello che stavo cercando! Grazie – Matteo