web-dev-qa-db-ja.com

FragmentからのstartActivityForResult()および子アクティビティの終了、FragmentでonActivityResult()を呼び出しません

FirstActivity.Javaには、startActivityForResult()を呼び出すFragmentA.Javaがあります。 SecondActivity.Javafinish()を呼び出しますが、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()が呼び出されることはありません。

154
Mr Roshan Pawar

次のようにFirstActivity.JavaonActivityResult()を記述する必要があります

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
   super.onActivityResult(requestCode, resultCode, data);
}

したがって、これはフラグメントのonActivityResult()を呼び出します

編集:解決策はgetActivity().startActivityForResult(i, 1);startActivityForResult(i, 1);に置き換えることです

237
Kevin Adesara

Kevinの答えは機能しますが、そのソリューションを使用してデータを操作するのが難しくなります。

最善の解決策は、アクティビティレベルでstartActivityForResult()を開始しないことです。

あなたの場合、getActivity().startActivityForResult(i, 1);を呼び出さないでください

代わりに、startActivityForResult()を使用するだけで、問題なく動作します! :)

32
Amit Patel

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メソッドがトリガーされます。

22
Rahul Giradkar

フラグメントには既にstartActivityForResultがあり、これを使用すると、getActivity()...の代わりにフラグメント内のonActivityResultが呼び出されます。

12

最も重要なことは、ここにすべてが欠けていることです... 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();メソッドを呼び出す

これがうまくいくことを願っています。

4
Shahbaz Ahmad

フラグメントから直接startActivityForResult()を呼び出すことができます。したがって、this.startActivityForResult(i, 1);の代わりにgetActivity().startActivityForResult(i, 1);を呼び出す必要があります。

Intent i = new Intent(getActivity(), SecondActivity.class);
i.putExtra("helloString", helloString);
this.startActivityForResult(i, 1);

アクティビティはアクティビティ結果をフラグメントに送信します。

4
sanjaymith

mAinActivityのonActivityResult()は、フラグメントがActivityに配置されているため、フラグメントのonActivityResult()が呼び出せないため、明らかにMainActivityに戻る

0
dileep krishnan