2010-10-12 13 views
227

Ich bin sehr neu in Android-Entwicklung.Starten Sie eine Aktivität mit einem Parameter

Ich möchte eine Aktivität erstellen und starten, um Informationen über ein Spiel anzuzeigen. Ich zeige diese Information ich brauche eine gameId.

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

Es ist wie die Aktivität hat nur ein Konstruktor mit einem Parameter.

Wie kann ich das tun?

Danke.

Antwort

398

Setzen Sie eine int, die Ihre ID in die neue Intent ist.

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

greifen dann die ID in Ihrem neuen Activity:

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

Sie mögen Stellen Sie sicher, b! = null, bevor Sie beginnen, davon zu greifen – Andrew

+0

Wie kann "b" Null in der zweiten Aktivität in diesem Code sein? Ich bekomme b ist Null auf create Methode der zweiten Aktivität. –

+2

B kann null sein, sagen wir, Sie möchten diese Aktivität von einem anderen Ort aus starten und Sie tun dies auf die übliche Weise, ohne Parameter. Es wird eine NPE werfen.Sie sollten diese Parameter immer als optional betrachten. –

100

Fügen Sie einfach zusätzliche Daten zum Intent Sie verwenden, um Ihre Aktivität zu nennen.

In der Anrufer Aktivität:

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

Im Inneren des onCreate() der Aktivität, die Sie anrufen:

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

Edit: Ups, Charlie Sheen war schneller.

+1

ist es in Ordnung, einen benutzerdefinierten Objekttyp zu übergeben? – Amyth

+1

@Amyth Nein, Sie müssen ein Bündel wie in der angenommenen Antwort verwenden. – AtlasRider

+0

Siehe dieses @Amyth: http://StackOverflow.com/Questions/14333449/Passing-Data-Through-Intent-Using-Serializable – Cold

3

Die vorhandenen Antworten (übergeben Sie die Daten in Intent übergeben an startActivity()) zeigen den normalen Weg, um dieses Problem zu lösen. Es gibt eine andere Lösung, die in dem seltenen 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 die Intent steuert Activity.

Sie können eine Basis-Klasse Activity erstellen, die einen Konstruktor mit einem Parameter hat, dann eine abgeleitete Klasse, die einen Standardkonstruktor hat, die den Basisklassenkonstruktor mit einem Wert nennt, wie so:

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 hartcodierten Wert durch einen Funktionsaufruf, der den richtigen Wert zurückgibt, der übergeben werden soll.

31

Ich mag es, mit einer statischen Methode in der zweiten Aktivität zu tun:

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 von Ihrer ersten Aktivität (und anderswo), die Sie gerade tun:

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

Dies macht meinen Code Weg sauberer. Vielen Dank. –

+0

Wirklich schöner Code. –

+0

Genau das, was ich gesucht habe! Danke – Matteo

Verwandte Themen