startActivityForResult () из фрагмента и заканчивая дочернюю активность, не вызывает onActivityResult () во фрагменте
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()
никогда не позовут.
9 ответов:
нужно писать
onActivityResult()
в своемFirstActivity.Java
следующим образом@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); }
так что это будет называть ваш фрагмент
onActivityResult()
Edit: решение заключается в замене
getActivity().startActivityForResult(i, 1);
СstartActivityForResult(i, 1);
ответ Кевина работает, но это делает его трудно играть с данными, используя это решение.
лучшее решение-не начинать
startActivityForResult()
на уровень активности.в вашем случае не называйте
getActivity().startActivityForResult(i, 1);
вместо этого, просто используйте
startActivityForResult()
и он будет работать отлично! :)
вы должны написать onActivityResult () в вашей FirstActivity.Java следующим образом
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { for (Fragment fragment : getChildFragmentManager().getFragments()) { fragment.onActivityResult(requestCode, resultCode, data); } }
это вызовет onActivityResult метод фрагментов на FirstActivity.java
фрагмент уже есть
startActivityForResult
, иonActivityResult
во фрагменте, если вы используете его, а неgetActivity()
...
самое главное, что все здесь хватает... Режим запуска FirstActivity должен быть синглетным. Если это singleInstance, onActivityResult в FragmentA будет вызван сразу после вызова метода startActivityForResult. Таким образом, он не будет ждать вызова метода finish() в SecondActivity.
так что пройдите через следующие шаги, это определенно будет работать, как это работало для меня тоже после долгого исследования.
В AndroidManifest.XML-файл, Сделать 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 фрагмента.
@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надеюсь, что это будет работать.
onActivityResult () MAinActivity вызовет, onActivityResult () Fragement не вызовет, потому что фрагмент помещается в Activity, поэтому очевидно, что он возвращается к MainActivity
мы могли бы назвать
startActivityForResult()
непосредственно из фрагмента Так что вы должны позвонитьthis.startActivityForResult(i, 1);
вместоgetActivity().startActivityForResult(i, 1);
Intent i = new Intent(getActivity(), SecondActivity.class); i.putExtra("helloString", helloString); this.startActivityForResult(i, 1);
Activity отправит результат активности в ваш фрагмент.