2010-10-12 20 views
227

Jestem bardzo nowy w zakresie programowania Androida.Rozpocznij aktywność z parametrem

Chcę utworzyć i rozpocząć działanie, aby wyświetlić informacje o grze. Pokazuję tę informację potrzebuję gameId.

Jak przekazać identyfikator tej gry do aktywności? Identyfikator gry jest absolutnie konieczny, więc nie chcę tworzyć ani uruchamiać aktywności, jeśli nie ma ona identyfikatora.

To jest jak działalność ma tylko jeden konstruktor z jednym parametrem.

Jak mogę to zrobić?

Dzięki.

Odpowiedz

398

Umieść int, który jest twoim identyfikatorem w nowym 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(); 

Następnie chwycić ID w nowym Activity:

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

może warto aby upewnić się, że b! = null zanim zaczniesz się z niego wyłapać – Andrew

+0

W jaki sposób "b" może mieć wartość zerową w drugim działaniu tego kodu? Otrzymuję b ma wartość null przy tworzeniu metody drugiej aktywności. –

+2

B może mieć wartość null, powiedzmy, że chcesz rozpocząć tę aktywność z innego miejsca i robisz to w standardowy sposób, bez żadnych parametrów. Rzuca NPE.Powinieneś zawsze brać pod uwagę te parametry opcjonalne. –

100

Wystarczy dodać dodatkowe dane do intencyjny użyć, aby wywołać swoją aktywność.

W działalności rozmówcy:

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

Wewnątrz onCreate() aktywności nazywasz:

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

Edit: Ups, Charlie Sheen był szybszy.

+1

czy można przekazać niestandardowy typ obiektu? – Amyth

+1

@Amyth Nie, musisz użyć pakietu podobnego do zaakceptowanej odpowiedzi. – AtlasRider

+0

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

3

Istniejące odpowiedzi (przekazać dane w Intent przekazane do startActivity()) pokazują normalny sposób rozwiązania tego problemu. Istnieje inne rozwiązanie, które można zastosować w przypadku, w którym tworzysz działanie, które zostanie uruchomione przez inną aplikację (na przykład jedną z czynności edycji w wtyczce Tasker) i dlatego nie kontrolujesz Intent, która uruchamia Activity.

Można utworzyć klasy base Activity że ma konstruktora z parametrem, a następnie klasy pochodnej, która ma domyślnego konstruktora, który wywołuje konstruktor bazowym klasy o wartości, a więc:

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

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

Jeśli potrzebujesz wygenerować parametr do przekazania do konstruktora klasy podstawowej, po prostu zamień zakodowaną wartość na wywołanie funkcji, które zwraca poprawną wartość do przekazania.

31

chciałabym zrobić to z metody statycznej w drugiej działalności:

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

Następnie od pierwszego działalności (i gdziekolwiek indziej), wystarczy zrobić:

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

Dzięki temu mój kod jest czystszy. Dziękuję Ci. –

+0

Naprawdę piękny kod. –

+0

Dokładnie to, czego szukałem! Dziękuję – Matteo