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()
永远不会被调用。
答案 0 :(得分:235)
您必须在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);
答案 1 :(得分:31)
凯文的答案有效但是使用该解决方案很难使用数据。
最佳解决方案是不要在活动级别启动startActivityForResult()
。
在您的情况下不要致电getActivity().startActivityForResult(i, 1);
相反,只需使用startActivityForResult()
,它就会完美无缺! :)
答案 2 :(得分:21)
您必须在FirstActivity.Java中编写onActivityResult(),如下所示
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
for (Fragment fragment : getSupportFragmentManager().getFragments()) {
fragment.onActivityResult(requestCode, resultCode, data);
}
}
这将在FirstActivity.java上触发片段的onActivityResult方法
答案 3 :(得分:12)
该片段已有startActivityForResult
,如果您使用该片段,则会在片段中调用onActivityResult
,而不是getActivity()
...
答案 4 :(得分:4)
我们可以直接从Fragment打电话给startActivityForResult()
因此,您应该拨打this.startActivityForResult(i, 1);
而不是getActivity().startActivityForResult(i, 1);
Intent i = new Intent(getActivity(), SecondActivity.class);
i.putExtra("helloString", helloString);
this.startActivityForResult(i, 1);
活动会将活动结果发送到您的片段。
答案 5 :(得分:4)
最重要的是,这里缺少的是...... FirstActivity的launchMode必须是singleTop。如果是singleInstance,则在调用startActivityForResult方法之后将调用FragmentA中的onActivityResult。因此,它不会等待在SecondActivity中调用finish()方法。
通过以下步骤,经过长时间的研究,它肯定会起作用,因为它也适用于我。
在AndroidManifest.xml文件中,将FirstActivity.Java的launchMode设为singleTop。
<activity
android:name=".FirstActivity"
android:label="@string/title_activity_main"
android:launchMode="singleTop"
android:theme="@style/AppTheme.NoActionBar" />
在FirstActivity.java中,重写onActivityResult方法。因为这将调用FragmentA的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");
}
从FragmentA.Java调用startActivityForResult(intent, HOMEWORK_POST_ACTIVITY);
在SecondActivity.java中调用finish();
方法
希望这会奏效。
答案 6 :(得分:1)
答案迟到了。但是对任何人都会有帮助。
在我的情况下,要从Fragment调用活动,然后从片段中调用setResult。
我使用了Fragment Like的getContext。
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) {
}
}
答案 7 :(得分:0)
答案 8 :(得分:0)
试试这个:
Dataframes
答案 9 :(得分:-2)
请勿在{{1}}方法中调用finish()
,然后才能正常工作。
答案 10 :(得分:-4)
在ParentActivity中调用onActivityresult()
。