startActivityForResult аварийно завершает работу, пока startActivity работает

У меня есть действие, которое я начинаю:

Intent intent = new Intent(this, CreateItemDetailsActivity.class);
if(storeId != null) {
    intent.putExtra(Identifiers.STORE_ID, storeId);
}
intent.putExtra(Identifiers.ITEM_NAME, name);
intent.putExtra(Identifiers.ITEM_DESCRIPTION, description);
startActivity(intent);

Это работает, но теперь мне нужно вернуть данные в исходное действие, поэтому я изменяю вызов startActivity на:

startActivityForResult(intent, CREATE_ITEM_RESULT);

(CREATE_ITEM_RESULT — это случайное целое число 63463657, которое я придумал)

Однако мое приложение вылетает без вызова ни одного метода onCreate (я реализовал и поставил точку останова в обоих):

Uncaught exception in thread main: java.lang.IllegalStateException: Could not execute method for android:onClick
android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:389)

(код вызывается в обработчике нажатия кнопки, следовательно, onClick)

Я видел сбой приложения при вызове startActivityForResult, который имеет ту же проблему, но принятый ответ предлагает удалить строку recipe.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);, которой у меня нет.

Почему у меня происходит сбой на startActivityForResult, в то время как startActivity работает отлично?

(Мой минимальный уровень SDK — 16, уровни целевого SDK и компиляции — 27, и я использую эмулятор Android 8.1)


person Can Poyrazoğlu    schedule 06.08.2018    source источник
comment
Попробуйте четырехзначное значение int.   -  person Barns    schedule 06.08.2018
comment
@Барнс серьезно??? это сработало. но почему? не могли бы вы опубликовать это как ответ?   -  person Can Poyrazoğlu    schedule 06.08.2018
comment
Не знаю. У меня были проблемы в прошлом, и когда я изменил intvalue на что-то меньшее (например, четыре цифры), это сработало. Я не проверял, какое максимальное значение int я могу использовать.   -  person Barns    schedule 06.08.2018


Ответы (2)


Если вы не видели никакой документации по этому вопросу, попробуйте четырехзначное значение int, чтобы избавиться от ошибки.

Я прочитал документы Google для startActivityForResult и не нашел никаких упоминаний о максимальном размере int. Даже в документации по коду указано:

@param requestCode Если >= 0, этот код будет возвращен в onActivityResult(), когда действие существует

Таким образом, не упоминается максимальное значение int. Странный...


ИЗМЕНИТЬ

Спасибо @MidasLefko за нахождение этой информации:

RequestCodes может быть максимум 0xffff (65535). Итак, вы, вероятно, вызываете startActivityForResult(intent, REQUEST_CODE); и REQUEST_CODE больше 65535.

на этом сайте:

https://code-examples.net/en/q/db5947

person Barns    schedule 06.08.2018
comment
Странный. Было бы гораздо логичнее, если бы сигнатура метода имела short вместо int. - person Can Poyrazoğlu; 06.08.2018
comment
Нашел эту ссылку, в которой говорится, что код запроса ограничен 0xffff (65535). Непонятно откуда они знают... - person MidasLefko; 06.08.2018

В неподдерживаемой реализации класса активности startActivityForResult нет ограничений на максимальное значение int для requestCode, если оно положительное. Однако FragmentActivity (и расширение AppCompatActivity) отменяет это поведение (документация):

void startActivityForResult (намерение намерения, int requestCode)

Изменяет стандартное поведение, чтобы разрешить доставку результатов во фрагменты. Это накладывает ограничение на то, что requestCode должен быть ‹= 0xffff.

В исходный код FragmentActivity можно найти следующий полезный комментарий:

Подсказка для индекса запроса следующего кандидата. Индексы запросов — это целые числа от 0 до 2^16-1, которые кодируются в старших 16 битах requestCode для вызовов Fragment.startActivityForResult(...). Это позволяет нам отправлять onActivityResult(...) в соответствующий фрагмент. Индексы запроса выделяются с помощью allocateRequestIndex(...).

int в java являются 32-битными, FragmentActivity использует 16, чтобы определить, в какой фрагмент отправить результат, а остальные 16 доступны для разработчика.

person MidasLefko    schedule 07.08.2018
comment
Хорошо найти Мидаса! Это было похоронено глубоко. - person Barns; 07.08.2018
comment
Теперь это имеет смысл. Было бы еще лучше, если бы он генерировал исключение, указывающее на проблему, вместо общего исключения недопустимого состояния. - person Can Poyrazoğlu; 07.08.2018
comment
Добро пожаловать на андроид ;) - person MidasLefko; 08.08.2018