Rozpocznij działanie z parametrem

292

Jestem bardzo nowy w rozwoju Androida.

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

Jak mogę przekazać ten identyfikator gry do działania? Identyfikator gry jest absolutnie niezbędny, więc nie chcę tworzyć ani uruchamiać aktywności, jeśli nie ma ona identyfikatora.

To tak, jakby działanie miało tylko jednego konstruktora z jednym parametrem.

Jak mogę to zrobić?

Dzięki.

VansFannel
źródło

Odpowiedzi:

506

Wstaw nowy, intktóry jest twoim identyfikatorem 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 weź identyfikator w swoim nowym Activity:

Bundle b = getIntent().getExtras();
int value = -1; // or other values
if(b != null)
    value = b.getInt("key");
Wroclai
źródło
42
Możesz się upewnić, że b! = Null, zanim zaczniesz z niego chwytać
Andrew,
Jak „b” może być zerowe w drugim działaniu w tym kodzie? Dostaję b ma wartość zero przy tworzeniu metody drugiej aktywności.
Murat Çorlu
3
B może być zerowe, powiedzmy, że chcesz rozpocząć tę aktywność z innego miejsca i robisz to w standardowy sposób, bez żadnych parametrów. Wyrzuci NPE. Zawsze powinieneś uważać te parametry za opcjonalne.
Gaspar de Elias,
53
Utworzenie nowego pakietu nie jest konieczne (a jeśli zrobisz dokumentację , musisz „użyć” nazwy pakietu, aby wprowadzić prefiks kluczy). Po prostu użyj intent.putExtra(String, Int).
Sam
1
Można argumentować, że lepiej nie sprawdzać wartości zerowej. en.wikipedia.org/wiki/Fail-fast .
setholopolus
124

Po prostu dodaj dodatkowe dane do celu, którego używasz do wywołania swojej aktywności.

W działaniu osoby dzwoniącej:

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

Wewnątrz onCreate () działania, które wywołujesz:

Bundle b = getIntent().getExtras();
int id = b.getInt("id");
DavGin
źródło
1
czy można podać niestandardowy typ obiektu?
Amyth
1
@Amyth Nie, musisz użyć pakietu jak w zaakceptowanej odpowiedzi.
AtlasRider,
38

Lubię to robić metodą statyczną w drugim ćwiczeniu:

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 pierwszej aktywności (i gdziekolwiek indziej) po prostu:

SecondActivity.start(this, "the.game.id");
pomber
źródło
Dokładnie tego szukałem! Dziękuję
Matteo
1
W metodzie onCreate nie powinno String gameId = intent.getStringExtra(EXTRA_EXTERNAL_ID);byćString gameId = intent.getStringExtra(EXTRA_GAME_ID);
marcusshep 11.11.16
Posiadanie statyki sprawi, że Twoje testy będą bardzo trudne.
John Tribe
Czy to wyciek pamięci? Przekazanie kontekstu statycznej metodzie wydaje mi się złym pomysłem. Dlaczego nie po prostu zwrócić zamiaru, a następnie rozpocząć działanie, używając tego zamiaru z pierwszej klasy?
AndroidDev,
4

Kod Kotlin:

Rozpocznij SecondActivity:

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

Uzyskaj identyfikator w 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
    }
}

gdzie gameIdjest String? (może być pusty)

Francis
źródło
3

Istniejące odpowiedzi (przekaż dane w Intentprzekazanym do startActivity()) pokazują normalny sposób rozwiązania tego problemu. Istnieje inne rozwiązanie, którego można użyć w dziwnym przypadku, gdy tworzysz działanie, które zostanie uruchomione przez inną aplikację (na przykład jedno z działań edycyjnych we wtyczce Tasker ), a zatem nie kontrolujesz, Intentktóry uruchamia Activity.

Możesz utworzyć klasę podstawową, Activityktóra ma konstruktor z parametrem, a następnie klasę pochodną, ​​która ma domyślny konstruktor, który wywołuje konstruktor klasy podstawowej o wartości, tak jak:

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

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

Jeśli musisz wygenerować parametr, aby przekazać go do konstruktora klasy podstawowej, po prostu zastąp zakodowaną wartość wywołaniem funkcji, która zwraca poprawną wartość do przekazania.

Trebor Rude
źródło