startActivityForResult не вызывает запуск onActivityResult при использовании Parcelable объектов в Intent
С простыми типами данных все работало, но когда пришлось переписать под передачу Parcelable объектов через Intent, onActivityResult перестал вызываться
вызов второго Activity в первом
@Override
public void onItemClick(int position, View v) {
Log.d(TAG, "onItemClick position: " + position);
Intent intent = new Intent(v.getContext(), ProductDetailActivity.class);
intent.putExtra(ID_KEY, position);
intent.putExtra(PRODUCTNAME,mProducts.get(position));
startActivityForResult(intent, REQUEST_EDIT_TYPE);
}
Открывается второй Activity, где Parcelable объект успешно обрабатывается и при нажатии ОК второе Activity завершает работу
public void onOKClick (View view) {
Log.d(TAG, "OK click");
String mProductName = productName.getText().toString();
double mProductEnergy = Double.parseDouble(productEnergy.getText().toString());
double mProductProtein = Double.parseDouble(productProtein.getText().toString());
double mProductFat = Double.parseDouble(productFat.getText().toString());
double mProductCarbohydrate = Double.parseDouble(productCarbohydrate.getText().toString());
Product mProduct = new Product(mProductName,mProductEnergy,mProductProtein,mProductFat,mProductCarbohydrate);
Intent data = new Intent();
data.putExtra(ProductsFragment.ID_KEY,position);
data.putExtra(ProductsFragment.PRODUCTNAME,mProduct);
setResult(RESULT_OK,data);
finish();
}
При нажатии Cancel тоже
public void onCancelClick (View view){
Log.d(TAG, "Cancel click");
setResult(RESULT_CANCELED);
finish();
}
Ну и собственно onActivityResult первого
public void onActivityResult (int requestCode, int resultCode, Intent data) {
Log.d(TAG,"OnActivityResult");
if (requestCode==REQUEST_EDIT_TYPE) {
Log.d(TAG, "Request edit");
if(resultCode==RESULT_OK){
Log.d(TAG, "Result OK");
int position = data.getIntExtra(ID_KEY,0);
Product mProduct = (Product) data.getParcelableExtra(PRODUCTNAME);
mProducts.add(mProduct);
}
else{
Log.d(TAG, "Edit canceled");
}
} else {
Log.d(TAG, "Result super");
super.onActivityResult(requestCode, resultCode, data);
}
Log.d(TAG, "Notify data changed");
adapter.notifyDataSetChanged();
}
Что при нажатии OK, что при нажатии Cancel onActivityResult не выполняется, что видно как по сообщениям в дебаге, так и по поведению приложения.
Пробовал назначать свои переменные RESULT_OK и RESULT_CANCELED, так как в Activity и во Fragment они разные. Находил информацию, что нужно только положительные их значения - не правда. Что самое странное Parcelable объект Product прекрасно передается с помощью Intent так как второе Activity его правильно распаковывает и обрабатывает, а onActivityResult даже с пустым Intent не хочет выполняться
Ответы (1 шт):
Вы явно указали не вызывать onActivityResult во фрагментах, которые содержатся в MainActivity, не вызвав super.onActivityResult() в MainActivity.
Вызовите super.onActivityResult() в MainActivity или просто удалите этот метод, раз в нём нет кода.