조각 및 마무리 하위 활동의 ​​startActivityForResult ()는 조각에서 onActivityResult ()를 호출하지 않습니다.


172

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()호출되지 않습니다.


1
FirstActivity 클래스에 (onActivityResult를 방법)을 넣어보십시오
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결코 호출됩니다. 도와주세요.
Mr Roshan Pawar 2016 년

52
getActivity (). startActivityForResult (i, 1)을 교체하십시오. startActivityForResult (i, 1)로;
케빈 아데 사라

14
허용 된 솔루션의 대답이 실제로 여기에 잘못된 것이 아니며 실제 솔루션이 startActivityForResult대신 대신 사용 하는 것일 수 getActivity().start...있습니까? 내가 볼 수있는 한, 당신은 onActivityResult활동에서 자체 정의로 정의를 재정의하고 있습니다 (즉, 응답의 재정의가 존재하지 않는 것과 정확히 동일하게 작동합니다).
amnn

@asQuirreL 예. 아마도 그 이유 일 것입니다.
안드로이드 개발자

1
나는 당신이 설명하고 똑같이, 활동의 onActivityResult ()를 조각으로도 super로 둘 다 super로 시작하고 startActivityForResult (intent, i)를 만들지 만 작동하지 않습니다. 도움이 필요합니다.
Amal Kronz

33

Kevin의 답변은 효과가 있지만 해당 솔루션을 사용하여 데이터를 재생하기가 어렵습니다.

최상의 솔루션은 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
고마워 친구! .하지만 그렇게 내 경우에는 내가에서 getSupportFragmentManager () findFragmentByTag 방법을 사용하지만 아이디어 .. 레벨 26 API를 requiere
Dagnogo 장 - 프랑수아을

15

프래그먼트에는 이미 , 대신 사용하는 경우 프래그먼트를 startActivityForResult호출 onActivityResult합니다 getActivity()...


7

가장 중요한 것은 여기에 모든 것이 빠져 있다는 것입니다. 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");
}

startActivityForResult(intent, HOMEWORK_POST_ACTIVITY);FragmentA.Java에서 전화

finish();SecondActivity.java의 메소드 호출

이것이 효과가 있기를 바랍니다.


이것이 가장 좋은 대답입니다. 매니페스트에서 "launchMode"를 정의하는 세부 사항은 매우 중요합니다.
Pablo Insua

5

우리는 startActivityForResult()Fragment에서 직접 전화 할 수 있으므로 this.startActivityForResult(i, 1);대신에 전화해야합니다.getActivity().startActivityForResult(i, 1);

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

활동은 활동 결과를 조각으로 보냅니다.


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) {

    }
}

0

MAinActivity의 onActivityResult ()는 호출하고 Fragement의 onActivityResult ()는 호출되지 않습니다. 조각은 Activity에 배치되므로 분명히 MainActivity로 돌아옵니다.



-6

onActivityresult()ParentActivity로 전화하십시오 .


@URAndroid 답변 주셔서 감사하지만 해결책을 얻었습니다. 귀하의 솔루션은 완벽하지 않습니다. 좋은 프로그래밍이 아닙니다.
Mr Roshan Pawar 2016 년

이것은 실제로 권장 되지 않습니다.
Lo-Tan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.