Почніть активність із параметра


292

Я дуже новачок в розробці Android.

Я хочу створити та розпочати діяльність, щоб показати інформацію про гру. Я показую, що інформація мені потрібна gameId.

Як я можу передати цей ідентифікатор гри в активність? Ідентифікатор гри абсолютно необхідний, тому я не хочу створювати або запускати діяльність, якщо у неї немає ідентифікатора.

Це як у діяльності є лише один конструктор з одним параметром.

Як я можу це зробити?

Дякую.

Відповіді:


506

Поставте, intщо є вашим ідентифікатором, у новий 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();

Потім візьміть ідентифікатор у вашому новому Activity:

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

42
Ви можете переконатися, що b! = Null, перш ніж почати захоплювати його
Андрій

Як "b" може бути недійсним у другій діяльності у цьому коді? Я отримую b недійсним для створення методу другої діяльності.
Murat Çorlu

3
B може бути недійсним, скажімо, ви хочете розпочати цю діяльність з іншого місця, і ви робите це звичайним способом, без парам. Це кине NPE. Ви завжди повинні вважати цей парам необов’язковим.
Гаспар де Еліас

53
Не потрібно створювати нову групу (і якщо ви робите документацію, то ви повинні "використовувати" ім'я пакета для префіксації ваших ключів.) Просто використовуйте intent.putExtra(String, Int).
Сем

1
Можна стверджувати, що краще не робити нульової перевірки. en.wikipedia.org/wiki/Fail-fast .
setholopolus

124

Просто додайте додаткові дані до намірів, якими ви користуєтесь для виклику своєї діяльності.

У діяльності абонента:

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

Всередині onCreate () дії, яку ви викликаєте:

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

1
чи добре передати користувацький тип об’єкта?
Аміт

1
@Amyth Ні, ви повинні використовувати пакет, як у прийнятій відповіді.
AtlasRider


38

Мені подобається це робити статичним методом у другій діяльності:

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

Тоді з першого заняття (і для будь-якого іншого) ви просто зробите:

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

Саме те, що я шукав! Дякую
Маттео

1
У методі String gameId = intent.getStringExtra(EXTRA_EXTERNAL_ID);String gameId = intent.getStringExtra(EXTRA_GAME_ID);
onCreate

Наявність статики зробить ваше тестування дуже важким.
Джон Плем'я

Це витік пам'яті? Передача контексту статичним методом здається мені поганою ідеєю. Чому б просто не повернути наміри і потім розпочати діяльність, використовуючи цей намір з першого класу?
AndroidDev

4

Котлін Код:

Почніть SecondActivity:

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

Введіть ідентифікатор 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
    }
}

де gameIdє String? (може бути нульовим)


3

Існуючі відповіді (передайте дані, які були Intentпередані startActivity()) показують нормальний спосіб вирішення цієї проблеми. Існує ще одне рішення, яке може бути використане у випадковому випадку, коли ви створюєте Діяльність, яку розпочне інший додаток (наприклад, одна з дій редагування в плагіні Tasker ), а отже, не контролюйте те, Intentщо запускає Activity.

Ви можете створити базовий клас Activity, у якому є конструктор з параметром, а потім похідний клас, який має конструктор за замовчуванням, який викликає конструктор базового класу зі значенням:

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

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

Якщо вам потрібно згенерувати параметр для передачі конструктору базового класу, просто замініть твердо закодоване значення на виклик функції, який повертає правильне значення для передачі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.