FirstActivity.Java
имеет FragmentA.Java
, который вызывает startActivityForResult()
.
SecondActivity.Java
вызов finish()
, но onActivityResult
никогда не будет вызван,
написанный в FragmentA.Java
.
FragmentA.Java
код:
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// some code
Intent i = new Intent(getActivity(), SecondActivity.class);
i.putExtra("helloString", helloString);
getActivity().startActivityForResult(i, 1);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
getActivity();
if(requestCode == 1 && resultCode == Activity.RESULT_OK) {
//some code
}
}
SecondActivity.Java
код:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//some code
Intent returnIntent = new Intent();
returnIntent.putExtra("result", result);
setResult(Activity.RESULT_OK,returnIntent);
finish();
}
Я попытался отладить код, но onAcitvityResult()
никогда не вызывается.
Ответ 1
Вы должны написать onActivityResult()
в своем FirstActivity.Java
следующим образом
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
Итак, это вызовет ваш фрагмент onActivityResult()
Изменить: решение заменить getActivity().startActivityForResult(i, 1);
на startActivityForResult(i, 1);
Ответ 2
Ответ Kevin работает, но это затрудняет воспроизведение данных с использованием этого решения.
Лучшее решение - не начинать startActivityForResult()
с уровня активности.
в вашем случае не вызывайте getActivity().startActivityForResult(i, 1);
Вместо этого просто используйте startActivityForResult()
, и он будет работать отлично!:)
Ответ 3
Вы должны написать onActivityResult() в вашем FirstActivity.Java следующим образом
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
Это вызовет метод фрагментов onActivityResult в FirstActivity.java
Ответ 4
Фрагмент уже имеет startActivityForResult
, который будет вызывать onActivityResult
в фрагменте, если вы используете его, вместо getActivity()
...
Ответ 5
Самое главное, что здесь все не хватает...
StartMode of FirstActivity должен быть singleTop. Если это singleInstance, onActivityResult в FragmentA вызывается сразу после вызова метода startActivityForResult. Таким образом, он не будет ждать вызова метода finish() в SecondActivity.
Итак, выполните следующие шаги. Это определенно будет работать, поскольку это сработало для меня тоже после долгого исследования.
В файле AndroidManifest.xml make launchMode из FirstActivity.Java как singleTop.
<activity
android:name=".FirstActivity"
android:label="@string/title_activity_main"
android:launchMode="singleTop"
android:theme="@style/AppTheme.NoActionBar" />
В FirstActivity.java переопределите метод onActivityResult. Поскольку это вызовет onActivityResult of FragmentA.
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
В FragmentA.Java переопределить метод onActivityResult
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d("FragmentA.java","onActivityResult called");
}
Вызвать startActivityForResult(intent, HOMEWORK_POST_ACTIVITY);
из FragmentA.Java
Вызвать finish();
метод в SecondActivity.java
Надеюсь, что это сработает.
Ответ 6
Мы могли бы называть startActivityForResult()
непосредственно из фрагмента
Поэтому вы должны называть this.startActivityForResult(i, 1);
вместо getActivity().startActivityForResult(i, 1);
Intent i = new Intent(getActivity(), SecondActivity.class);
i.putExtra("helloString", helloString);
this.startActivityForResult(i, 1);
Действие отправит результат действия в ваш фрагмент.
Ответ 7
onActivityResult() из MAinActivity будет вызывать, onActivityResult() из Fragement не будет вызывать, потому что фрагмент помещается в Activity, поэтому, очевидно, он возвращается к MainActivity
Ответ 8
Пусть уже поздно для ответа. Но будет полезно для всех.
В моем случае хотите вызвать действие из фрагмента и setResult обратно из фрагмента.
Я использовал getContext из фрагмента Like.
startActivityForResult(new Intent(getContext(), NextActivity.class), 111);
И установить результат из фрагмента
getActivity().setResult(Activity.RESULT_OK);
getActivity().finish();
Теперь получаем результат для фрагментирования с помощью
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK && requestCode == 111) {
}
}
Ответ 9
Не вызывайте finish()
в методе onCreate()
, тогда он отлично работает.
Ответ 10
вызовите onActivityresult()
в ParentActivity.