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


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.