onActivityResult의 요청 코드가 잘못되었습니다


310

내 조각에서 새로운 활동을 시작하고 있습니다.

startActivityForResult(intent, 1);

Fragment의 부모 활동에서 결과를 처리하려고합니다.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d(TAG, "onActivityResult, requestCode: " + requestCode + ", resultCode: " + resultCode);
    if (requestCode == 1) {
        // bla bla bla
    }
}

문제는 requestCode내가 방금 게시 한 적이 없다는 것 startActivityForResult()입니다.

내가 좋아하는 뭔가있어 0x40001, 0x20001임의의 높은 비트 세트 등. 문서는 이것에 대해 아무 말도하지 않습니다. 어떤 아이디어?


답변:


837

startActivityForResult()에서 님에게 전화 중 입니다 Fragment. 이 작업을 수행 할 때의 소유주는에 requestCode의해 변경됩니다 .ActivityFragment

resultCode당신의 활동 에서 올바른 것을 얻으려면 이것을 시도하십시오 :

변화:

startActivityForResult(intent, 1);

에:

getActivity().startActivityForResult(intent, 1);

44
결과를 전달할 조각을 결정해야하기 때문입니다. 조각이 StartActivityForResult를 호출 할 때 requestCode는 액티비티에 의해 변경되므로 결과를 어떤 조각으로 전달 하는지를 알게됩니다. 실제로 Activiy에서 결과를 얻으려면 getActivity (). startActivityForResult ()를 호출하십시오.
Changwei Yao

31
참고 사항 : startActivityForResult조각에서 사용 하고 해당 조각에서 결과를 기대하는 경우 호스트 활동 onActivityResult을 호출해야합니다 super.onActivityResult(해당 메소드를 재정의하는 경우). 액티비티 onActivityResult는 프래그먼트를 호출하는 것으로 보입니다 onActivityResult. 또한 요청 코드는 액티비티의를 통해 이동할 때 onActivityResultDimanoid가 아래 답변에 게시 한 링크에 설명 된대로 변경됩니다. 당신은 그것을 알아야 할 필요는 없지만 당신은 결코 알지 못합니다.
Ferran Maylinch

31
"요청 코드는 프래그먼트를 소유 한 액티비티에 의해 변경됩니다"-안드로이드 디자인을 좋아해야합니다 ...
Tiago

13
문서에서 명확한 곳을 찾을 수없는 중요한 정보입니다. 당신의 인생을 지옥으로 만들도록 설계된 안드로이드 디자인을 좋아해야합니다.
Driss Bounouar

2
나는 당신을 사랑합니다, 나는이 문제를 이해하고 오류를 해결하기 위해 많은 시간을 보냈습니다. 감사합니다!
tinyCoder 2016 년

35

요청 코드가 잘못되었습니다. v4 지원 라이브러리 프래그먼트를 사용하는 경우 프래그먼트 인덱스는 요청 코드의 상위 16 비트로 인코딩되고 요청 코드는 하위 16 비트에 있습니다. 조각 색인은 나중에 결과를 전달할 올바른 조각을 찾는 데 사용됩니다.

따라서 활동이 조각 개체에서 시작되면 다음과 같이 onActivityResult requestCode를 처리하십시오.

originalRequestCode = changedRequestCode - (indexOfFragment << 16)
      6             =      196614        -       (3 << 16)

1
이 문제의 정확한 원인을 설명하는 훌륭한 정보
Muzikant

빠른 질문 : indexOfFragment 란 무엇입니까?
Louis Tsai

indexOfFragment는 getSupportFragmentManager (). getFragments ()가 생성하는 색인입니다.
HerberthObregon

25

더 쉬움 :

자바 : int unmaskedRequestCode = requestCode & 0x0000ffff

코 틀린 : val unmaskedRequestCode = requestCode and 0x0000ffff

하위 16 비트를 확인하고 논리 AND를 수행하여 상위 16 비트를 0으로 마스크 해제하십시오.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    final int unmaskedRequestCode = requestCode & 0x0000ffff

    if(unmaskedRequestCode == ORIGINAL_REQUEST_CODE){
      //Do stuff

    }
}

1
원래 요청 코드를 제공하지 않는 이유를 알려주시겠습니까?
K.Sopheak

3
requestCode는 Fragment를 소유 한 Activity에 의해 변경됩니다. Ashlesha Sharma 답변보기
Jaime Agudo

고마워, 이것이 내가 찾던 대답이다. 안드로이드가 원래 요청 코드를 반환해서는 안되는 이유를 모르겠습니다.
tonisives 2012 년

이것은 오늘 나에게 큰 도움이되었으며 실제로 문제를 정말 멋지게 설명합니다. 감사!
Billy Lazzaro

6

상수를 제공하는 경우 공개하고 다음에서 사용하십시오. startActivityResult

예:

public static final int REQUEST_CODE =1;
getActivity().startActivityForresult(intent, REQUEST_CODE);

2

또한 정의 할 수
super.onActivityResult(requestCode, resultCode, data)
있는 Activity(재정의 경우 onActivityResult이에서)

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {

        ...

        default:
            super.onActivityResult(requestCode, resultCode, data);
    }
}

그리고 startActivityForResult(intent, requestCode)당신의 내부에 전화Fragment


0

조각으로

  getActivity().startActivityForResult(builder.build(getActivity()), PLACE_PICKER_REQUEST);

주요 활동에서 :

if (requestCode == PLACE_PICKER_REQUEST) {
            if (resultCode == RESULT_OK) {    
     //what ever you want to do
            }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.