Inizia un'attività con un parametro


292

Sono molto nuovo sullo sviluppo di Android.

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

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

E 'come se l'attività si è ottenuto solo un costruttore con un parametro.

Come lo posso fare?

Grazie.

Risposte:


506

Inserisci un intqual è 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();

Quindi prendi l'id nel tuo nuovo Activity:

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

42
Potresti assicurarti che b! = Null prima di iniziare a prenderlo
Andrew,

Come può "b" essere nullo nella seconda attività in questo codice? Ottengo b è nullo nel metodo di creazione della seconda attività.
Murat Çorlu,

3
B può essere nullo, diciamo che vuoi iniziare questa attività da un altro posto e lo fai in modo standard, senza parametri. Lancerà un NPE. Dovresti sempre considerare questo parametro opzionale.
Gaspar de Elias,

53
Non è necessario creare un nuovo pacchetto (e se lo fai la documentazione dice che "devi" usare il nome del pacchetto per aggiungere il prefisso alle tue chiavi.) Usa semplicemente intent.putExtra(String, Int).
Sam,

1
Si potrebbe sostenere che è meglio non fare un controllo nullo. en.wikipedia.org/wiki/Fail-fast .
setholopolus,

124

Aggiungi semplicemente dati extra all'intento che usi per chiamare la tua attività.

Nell'attività del chiamante:

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

All'interno di onCreate () dell'attività che chiami:

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

1
va bene passare un tipo di oggetto personalizzato?
Amyth,

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


38

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);
}

Quindi dalla tua prima attività (e per qualsiasi altra parte), fai semplicemente:

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

Esattamente quello che stavo cercando! Grazie
Matteo,

1
Nel metodo onCreate non dovrebbe String gameId = intent.getStringExtra(EXTRA_EXTERNAL_ID);essereString gameId = intent.getStringExtra(EXTRA_GAME_ID);
marcusshep l'

Avere statica renderà il tuo test molto difficile.
John Tribe,

È una perdita di memoria? Passare il contesto a un metodo statico mi sembra una cattiva idea. Perché non solo restituire l'intento e quindi avviare l'attività usando quell'intento dalla prima classe?
AndroidDev

4

Codice Kotlin:

Inizia il SecondActivity:

startActivity(Intent(context, SecondActivity::class.java)
    .putExtra(SecondActivity.PARAM_GAME_ID, gameId))

Ottieni l'ID in SecondActivity:

class CaptureActivity : AppCompatActivity() {

    companion object {
        const val PARAM_GAME_ID = "PARAM_GAME_ID"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val gameId = intent.getStringExtra(PARAM_GAME_ID)
        // TODO use gameId
    }
}

dove si gameIdtrova String? (può essere nullo)


3

Le risposte esistenti (passare i dati nel Intentpassato a startActivity()) mostrano il modo normale di risolvere questo problema. Esiste un'altra soluzione che può essere utilizzata nel caso dispari 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 quindi non controlla ciò Intentche avvia il Activity.

È possibile creare una classe base Activityche ha un costruttore con un parametro, quindi una classe derivata che ha un costruttore predefinito che chiama il costruttore della classe base con un valore, in questo modo:

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.