Starten Sie eine Aktivität mit einem Parameter

292

Ich bin sehr neu in der Android-Entwicklung.

Ich möchte eine Aktivität erstellen und starten, um Informationen zu einem Spiel anzuzeigen. Ich zeige diese Informationen, ich brauche eine Spiel-ID.

Wie kann ich diese Spiel-ID an die Aktivität weitergeben? Die Spiel-ID ist unbedingt erforderlich, daher möchte ich die Aktivität nicht erstellen oder starten, wenn sie nicht über die ID verfügt.

Es ist, als hätte die Aktivität nur einen Konstruktor mit einem Parameter.

Wie kann ich das machen?

Vielen Dank.

VansFannel
quelle

Antworten:

506

Setzen Sie eine, intdie Ihre ID ist, in die neue ein 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();

Dann holen Sie sich die ID in Ihrem neuen Activity:

Bundle b = getIntent().getExtras();
int value = -1; // or other values
if(b != null)
    value = b.getInt("key");
Wroclai
quelle
42
Vielleicht möchten Sie sicherstellen, dass b! = Null ist, bevor Sie anfangen, es zu greifen
Andrew
Wie kann "b" in der zweiten Aktivität in diesem Code null sein? Ich erhalte b ist null beim Erstellen der Methode der zweiten Aktivität.
Murat Çorlu
3
B kann null sein. Nehmen wir an, Sie möchten diese Aktivität von einem anderen Ort aus starten und tun dies auf die übliche Weise ohne Parameter. Es wird eine NPE werfen. Sie sollten diese Parameter immer als optional betrachten.
Gaspar de Elias
53
Es ist nicht erforderlich, ein neues Bundle zu erstellen (und wenn Sie dies tun , heißt es in der Dokumentation, dass Sie den Paketnamen als Präfix für Ihre Schlüssel verwenden müssen.) Verwenden Sie einfach intent.putExtra(String, Int).
Sam
1
Man könnte argumentieren, dass es besser ist, keine Nullprüfung durchzuführen. en.wikipedia.org/wiki/Fail-fast .
Setholopolus
124

Fügen Sie einfach zusätzliche Daten zu der Absicht hinzu, mit der Sie Ihre Aktivität aufrufen.

In der Anruferaktivität:

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

Innerhalb von onCreate () der Aktivität, die Sie aufrufen:

Bundle b = getIntent().getExtras();
int id = b.getInt("id");
DavGin
quelle
1
Ist es in Ordnung, einen benutzerdefinierten Objekttyp zu übergeben?
Amyth
1
@Amyth Nein, Sie müssen ein Bundle wie in der akzeptierten Antwort verwenden.
AtlasRider
Siehe diese @Amyth: stackoverflow.com/questions/14333449/…
Cold
38

Ich mache es gerne mit einer statischen Methode in der zweiten Aktivität:

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

Dann machen Sie von Ihrer ersten Aktivität (und für irgendwo anders) einfach:

SecondActivity.start(this, "the.game.id");
pomber
quelle
Genau das, wonach ich gesucht habe! Vielen Dank
Matteo
1
In der onCreate-Methode sollte nicht String gameId = intent.getStringExtra(EXTRA_EXTERNAL_ID);seinString gameId = intent.getStringExtra(EXTRA_GAME_ID);
marcusshep
Statik macht Ihre Tests sehr schwierig.
John Tribe
Ist das ein Speicherverlust? Den Kontext in eine statische Methode zu überführen, scheint mir eine schlechte Idee zu sein. Warum nicht einfach die Absicht zurückgeben und dann die Aktivität mit dieser Absicht aus der ersten Klasse starten?
AndroidDev
4

Kotlin-Code:

Starten Sie die SecondActivity:

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

Holen Sie sich die 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
    }
}

wo gameIdist String? (kann null sein)

Francis
quelle
3

Die vorhandenen Antworten (Übergeben der Daten an Intentübergeben startActivity()) zeigen den normalen Weg zur Lösung dieses Problems. Es gibt eine andere Lösung, die in dem seltsamen Fall verwendet werden kann, in dem Sie eine Aktivität erstellen, die von einer anderen App gestartet wird (z. B. eine der Bearbeitungsaktivitäten in einem Tasker- Plugin) und daher nicht steuern, Intentwelche die Aktivität startet Activity.

Sie können eine Basisklasse erstellen Activity, die einen Konstruktor mit einem Parameter hat, und dann eine abgeleitete Klasse, die einen Standardkonstruktor hat, der den Basisklassenkonstruktor mit einem Wert aufruft, wie folgt:

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

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

Wenn Sie den Parameter generieren müssen, der an den Basisklassenkonstruktor übergeben werden soll, ersetzen Sie einfach den fest codierten Wert durch einen Funktionsaufruf, der den richtigen zu übergebenden Wert zurückgibt.

Trebor unhöflich
quelle