FirstActivity.Java
には、startActivityForResult()
を呼び出すFragmentA.Java
があります。 SecondActivity.Java
はfinish()
を呼び出しますが、FragmentA.Java
で記述されたonActivityResult
は呼び出されません。
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()
が呼び出されることはありません。
次のようにFirstActivity.Java
にonActivityResult()
を記述する必要があります
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
したがって、これはフラグメントのonActivityResult()
を呼び出します
編集:解決策はgetActivity().startActivityForResult(i, 1);
をstartActivityForResult(i, 1);
に置き換えることです
Kevinの答えは機能しますが、そのソリューションを使用してデータを操作するのが難しくなります。
最善の解決策は、アクティビティレベルでstartActivityForResult()
を開始しないことです。
あなたの場合、getActivity().startActivityForResult(i, 1);
を呼び出さないでください
代わりに、startActivityForResult()
を使用するだけで、問題なく動作します! :)
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メソッドがトリガーされます。
フラグメントには既にstartActivityForResult
があり、これを使用すると、getActivity()
...の代わりにフラグメント内のonActivityResult
が呼び出されます。
最も重要なことは、ここにすべてが欠けていることです... 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();
メソッドを呼び出す
これがうまくいくことを願っています。
フラグメントから直接startActivityForResult()
を呼び出すことができます。したがって、this.startActivityForResult(i, 1);
の代わりにgetActivity().startActivityForResult(i, 1);
を呼び出す必要があります。
Intent i = new Intent(getActivity(), SecondActivity.class);
i.putExtra("helloString", helloString);
this.startActivityForResult(i, 1);
アクティビティはアクティビティ結果をフラグメントに送信します。
mAinActivityのonActivityResult()は、フラグメントがActivityに配置されているため、フラグメントのonActivityResult()が呼び出せないため、明らかにMainActivityに戻る