FragmentからのstartActivityForResult()および子アクティビティの終了、FragmentでonActivityResult()を呼び出さない


172

FirstActivity.JavaFragmentA.Javaを呼び出すaがあります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クラスに配置してみてください
viplezer

回答:


271

次のように書い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);


4
@Kevinに感謝します。あなたが言ったことを試してみましたが、機能しません。しかし、私は見、コードをデバッグonActivityresult()FirstAcivity.Java呼び出されるとonActivityresult()FragmentA.Java決して呼び出されます。助けてください。
Roshan Pawar氏2013年

52
getActivity()。startActivityForResult(i、1);を置き換えてください。startActivityForResult(i、1);
Kevin Adesara 2013年

14
受け入れられた解決策の答えは実際にはここで何が間違っているのではなく、本当の解決策はstartActivityForResult代わりに単に使用することですgetActivity().start...か?私の知る限りonActivityResultでは、アクティビティの定義を独自の定義でオーバーライドしています(つまり、これは、回答のオーバーライドが存在しない場合とまったく同じように動作します)。
14

@asQuirreLはい。これがおそらく理由です。
Android開発者

1
私はあなたが両方で、スーパーでもフラグメントでの活動で、オーバーライドonActivityResult()説明し、(意図、ⅰ)startActivityForResultを作るのと同じ操作を行うが、仕事をしませんでした、私は助けが必要下さい
アマルKronz

33

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

最善の解決策はstartActivityForResult()、活動レベルから開始しないことです。

あなたの場合は電話しないでください getActivity().startActivityForResult(i, 1);

代わりに、使用するだけでstartActivityForResult()完璧に機能します!:)


27

次のように、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メソッドがトリガーされます


2
どうも !ただし、レベル26のAPIが必要です..したがって、私の場合、getSupportFragmentManager()。findFragmentByTagメソッドを使用しましたが、あなたのアイデア
DagnogoJean-FrançoisJan

15

フラグメントにはすでにがありstartActivityForResultonActivityResult使用するとフラグメントの代わりに呼び出されますgetActivity()...


7

ここですべて欠落している最も重要なことは... FirstActivityのlaunchModeはsingleTopでなければなりません。singleInstanceの場合、FragmentAのonActivityResultは、startActivityForResultメソッドを呼び出した直後に呼び出されます。そのため、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");
}

startActivityForResult(intent, HOMEWORK_POST_ACTIVITY);FragmentA.Javaからの呼び出し

コールfinish();SecondActivity.javaのメソッド

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


これが最良の答えです。マニフェストで「launchMode」を定義する詳細は非常に重要です。
Pablo Insua、

5

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

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

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


1

答えが遅くなるかもしれません。しかし、誰にとっても役に立ちます。

私の場合、フラグメントからアクティビティを呼び出し、フラグメントから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) {

    }
}

0

MAinActivityのonActivityResult()はを呼び出し、フラグメントはActivityに配置されているため、FragmentのonActivityResult()は呼び出しを行わないため、明らかにMainActivityに戻ります。



-6

onActivityresult()ParentActivityであなたを呼び出します。


回答@URAndroidをありがとう、しかし解決策を得た あなたのソリューションは完璧ではありません。それは良いプログラミングではありません。
Roshan Pawar氏2013年

これは実際に推奨されません
Lo-Tan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.