조각에서 onActivityResult가 호출되지 않습니다


877

이 조각을 호스팅하는 활동 onActivityResult은 카메라 활동이 반환 될 때 호출됩니다.

내 조각은 카메라가 사진을 찍으려고 보낸 의도로 결과에 대한 활동을 시작합니다. 사진 응용 프로그램이 제대로로드되어 사진을 찍고 돌아옵니다. onActivityResult그러나 명중되지 않습니다. 중단 점을 설정했지만 아무 것도 트리거되지 않습니다. 조각이있을 수 있습니까 onActivityResult? 제공된 기능이기 때문에 그렇게 생각합니다. 왜 이것이 발생하지 않습니까?

ImageView myImage = (ImageView)inflatedView.findViewById(R.id.image);
myImage.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, 1888);
    }
});

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if( requestCode == 1888 ) {
        Bitmap photo = (Bitmap) data.getExtras().get("data");
        ((ImageView)inflatedView.findViewById(R.id.image)).setImageBitmap(photo);
    }
}

2
이 게시물을 확인, 문제 설명 및 일반적인 해결 방법이 있습니다 : stackoverflow.com/questions/6147884/…
Oleksii K.

5
이것을 읽는 다른 사람은 당신이 통과했는지 확인하십시오 requestCode >= 0!
Muhammad Babar

3
또한 활동 LauchMode가 singleInstance 또는 singleTask가 아니어야합니다. 그렇지 않으면 onActivityResult가 호출되지 않습니다
Jawad Zeb


Activity의 onActivityResult를 Fragment로 리디렉션해야합니다. 이 링크를 참조하십시오 : codexpedia.com/android/…
Reejesh PK

답변:


1239

호스팅 활동이을 (를) 재정의 onActivityResult()하지만 super.onActivityResult()처리되지 않은 결과 코드를 호출하지 않았습니다 . 분명히 조각이 startActivityForResult()전화를 거는 것이더라도 액티비티는 결과를 처리 할 때 첫 번째 샷을 얻습니다. 이것은 조각의 모듈성을 고려할 때 의미가 있습니다. super.onActivityResult()처리되지 않은 모든 결과에 대해 구현 하면 조각이 결과를 처리하는 데 성공했습니다.

또한 @siqing 답변에서

프래그먼트에서 결과를 얻으려면 프래그먼트 내부 startActivityForResult(intent,111);대신 호출해야합니다 getActivity().startActivityForResult(intent,111);.


34
활동의 onActivityResult에서 super.onActivityResult ()
Spidy

167
@StErMi 조각에서 getActivity (). startActivityForResult ()가 아닌 startActivityForResult ()를 호출해야합니다. 아래의 siqing 답변을 참조하십시오.
OferR

8
지원 라이브러리가 사용되는 관련 버그가있는 것 같습니다. code.google.com/p/android/issues/detail?id=15394
Ollie C

82
또한 중첩 된 조각을 사용 getParentFragment().startActivityForResult하는 경우 부모 조각에 onActivityResult 메서드 가 호출 되도록 자식 조각을 호출 해야합니다.
Eric Brynsvold

7
@EricBrynsvold가 옳았습니다. startActivityForResult는 중첩 된 조각에서 작동하지 않습니다. 이를 위해 getParentFragment (). startActivityForResult ()를 호출하고 해당 부모 조각에서 onActivityResult ()를 구현할 수 있으며 해당 메소드에서 결과를 하위 조각에 전달합니다 (예 : childFragment.getParentFragment ()). onActivityResult (requestCode, resultCode, data)
edrian

328

당신이 전화했다고 생각합니다 getActivity().startActivityForResult(intent,111);. 에 전화해야합니다 startActivityForResult(intent,111);.


3
또한과 같은 문제가 있었 RingtonePreference에 위치 PreferenceFragment. 불행히도을 RingtonePreference호출 하고 활동을 getActivity().startActivityForResult()호출했지만 결과를 얻지 못했습니다 . 클래스에서 파생 된 클래스 를 만들도록 강요 받았으며 ,이 클래스는 자신을 and에 호출합니다 . super.onActivityResultonActivityResultRingtonePreferencePreferenceFragmentfragment.startActivityForResult()
Stan

@ siqing 정적 메소드에서 startActivitForResult를 호출 할 수 없습니다. 그에 대한 해결책이 있습니까? activity.startActivityForResult를 사용해야합니다. 이것 좀 도와주세요
Shreyash Mahajan

269

옵션 1:

startActivityForResult()프래그먼트에서 호출하는 경우 onActivityResult () 프래그먼트가 생성되므로 startActivityForResult(), not을 호출해야합니다 getActivity().startActivityForResult().

어디에서 전화를 걸고 startActivityForResult()어떻게 전화를 걸지 잘 모르겠다면

옵션 2 :

Activity는의 결과를 가져 오므로 처리되지 않은 결과 코드 또는 모두에 onActivityResult()대해 활동을 재정의 onActivityResult()하고 호출 super.onActivityResult()하여 해당 조각으로 전파해야합니다.

위의 두 가지 옵션이 작동하지 않으면 옵션 3을 참조하십시오.

옵션 3 :

조각에서 onActivityResult 함수로의 명시적인 호출은 다음과 같습니다.

부모 Activity 클래스에서 onActivityResult () 메서드를 재정의하고 Fragment 클래스에서 동일하게 재정의하고 다음 코드와 같이 호출하십시오.

부모 클래스에서 :

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.dualPane);
    fragment.onActivityResult(requestCode, resultCode, data);
}

어린이 수업에서 :

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // In fragment class callback
}

4
이것은 나를 위해 일했습니다. 불쾌한 해결 방법이지만이 바보 같은 버그를 해결하는 더 좋은 아이디어는 없습니다 ...
Bogdan Zurac

@Vivky, 당신의 대답은 나를 위해 일했습니다. 그러나 setResult(); finish();두 번째 액티비티에서 뒤로 물러서 onActivityResult면서 제공된로 호출되는 대신 내가 직면하고있는 또 하나의 문제 가 RESULT_CODE있습니다.
snehal_penurkar

훌륭한 답변. 나는 그것을 달성하기 위해 세 번째 솔루션을 구현했습니다.
Sash_KP

나는 해결책 3이 효과가 있다고 생각하지만 onActivityResult()활동의 결과는 이상 requestCode을 반환 하여 내 조각으로 전달 된 다음 무시됩니다. = /
E-Kami

1
@notGeek 맞습니다. 조각 또는 activity에서 호출 한 경우에도 Activity에 항상 결과가 표시됩니다.
Vinayak

83

활동의 조각을 모르는 경우 조각을 모두 열거하고 활동 결과 인수를 보냅니다.

// In your activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    for (Fragment fragment : getSupportFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}

3
젠장, 나는 가장 간단한 해결책을 찾았지만 getFragments ()와 같은 방법은 없다고 생각했다.
WindRider

2
@WindRider 있습니다. Android 지원 라이브러리 (AppCompat)를 사용하는 경우
dasar

2
또한 배열의 조각이 자체 참조가 아닌지 확인 해야하는 어려운 방법을 배웠습니다! `if (fragment! = this) {fragment.onActivityResult (요청 코드, 결과 코드, 데이터); `
reubenjohn

조각이 중첩되어 있으면 맨 위 조각 만 목록에 있으므로 작동하지 않습니다. super.onActivityResult ()가 이미 목록의 모든 조각에서 onActivityResult ()를 호출하고 있다고 생각 하므로이 아이디어는 중복됩니다.
BeccaP


83

에 동일한 문제가 있습니다 ChildFragmentManager. 관리자는 결과를 중첩 된 조각으로 전달하지 않으므로 기본 조각에서 수동으로 수행해야합니다.

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    Fragment fragment = (Fragment) getChildFragmentManager().findFragmentByTag(childTag);
    if (fragment != null) {
        fragment.onActivityResult(requestCode, resultCode, intent);
    }
}

1
자녀 조각을 개인 회원으로 보유한 경우 Fragment fragment = myChildFragment;findFragmentByTag코드 줄 을 대신 사용 하십시오 . 나머지는 그대로 유지 될 수 있습니다.
lcn

7
조각을 개인 멤버로 유지하지 않는 것이 좋습니다. 그들은 그들 자신의 수명주기를 가지고 있기 때문에 당신은 그들과 상호 작용하기에 좋은 상태에 있는지 알지 못합니다. 또한 그들은 꽤 무겁고 메모리 누수에 대해 걱정할 것입니다. 관리자가 필요하지 않은 경우 관리자가 작성되지 않았을 것입니다.
MinceMan

67

원본 게시물.

FragmentActivityrequestCode수정 된 것으로 대체합니다 . 그런 다음, onActivityResult()호출 될 때 FragmentActivity상위 16 비트를 구문 분석하고 원래 단편의 색인을 복원합니다. 이 계획을보십시오 :

여기에 이미지 설명을 입력하십시오

루트 레벨에 몇 개의 프래그먼트가 있으면 아무런 문제가 없습니다. 그러나 예를 들어 내부에 몇 개의 탭 이있는 중첩 된 조각 이있는 경우 문제가 발생 하거나 이미 직면하고 있음 을 보장 합니다.FragmentViewPager

하나의 색인 만 내부에 저장 되기 때문requestCode 입니다. 그것은 Fragment내부의 색인입니다 FragmentManager. 중첩 된 프래그먼트를 사용하는 경우, 하위 프래그먼트가있는 자식 FragmentManager이 있습니다. 따라서 root에서 시작하여 전체 인덱스 체인을 저장해야합니다 FragmentManager.

여기에 이미지 설명을 입력하십시오

이 문제를 어떻게 해결합니까? 이 게시물 에는 일반적인 해결 방법 이 있습니다 .

GitHub : https://github.com/shamanland/nested-fragment-issue


다른 조각을 탭으로 보유하는 부모 조각에 ViewPager를 사용한 것과 동일한 문제가 있습니다. 중첩 된 조각 문제를 사용하려고했지만 컴파일 오류가 발생했습니다. 나에게 해결책을 제안 할 수 있습니까? 너무 여기에 문제를 제기 github.com/shamanland/nested-fragment-issue/issues/2
CGR

나는 github에 대답 했으므로 여기서이
Oleksii K.

감사! 권장 솔루션이 아닌 경우 컴파일 오류가 있음을 알기 위해 시간을 소비 할 필요가 없도록 답변을 적절하게 편집하는 것이 좋습니다.
cgr

44

이것은 가장 인기있는 문제 중 하나입니다. 이 문제와 관련하여 많은 스레드를 찾을 수 있습니다. 그러나 그들 중 어느 것도 ME에 유용하지 않습니다.

그래서이 솔루션을 사용 하여이 문제를 해결했습니다.

왜 이런 일이 일어나고 있는지 이해합시다.

우리는 startActivityForResultFragment에서 직접 호출 할 수 있지만 실제로 정비사 뒤에는 활동이 모두 처리됩니다.

startActivityForResultFragment에서 호출하면 requestCode가 Fragment의 ID를 코드에 첨부하도록 변경됩니다. 그러면 액티비티는 결과가 수신되면이 요청을 보낸 사람을 추적 할 수 있습니다.

Activity가 다시 탐색되면 결과는 수정 된 requestCode와 함께 Activity의 onActivityResult로 전송되며 원래 requestCode + Fragment의 ID로 디코딩됩니다. 그런 다음 Activity는 onActivityResult를 통해 활동 결과를 해당 조각으로 보냅니다. 그리고 다 끝났습니다.

문제는:

액티비티는 액티비티에 직접 첨부되었지만 중첩 된 것은 아닌 프래그먼트에만 결과를 보낼 수 있습니다. 이것이 중첩 프래그먼트의 onActivityResult가 무엇이든 호출되지 않는 이유입니다.

해결책:

1) 아래 코드로 조각에서 의도를 시작하십시오.

       /** Pass your fragment reference **/
       frag.startActivityForResult(intent, REQUEST_CODE); // REQUEST_CODE = 12345

2) 이제 부모 활동 무시에서 **onActivityResult() : **

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

작동하려면 부모 활동에서 이것을 호출해야합니다.

3) 조각 전화에서 :

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {

       }
}

그게 다야. 이 솔루션을 사용하면 중첩 여부에 관계없이 단일 조각에 적용 할 수 있습니다. 그리고 네, 모든 경우에도 적용됩니다! 또한 코드도 훌륭하고 깨끗합니다.


나는 '활동'으로 시스템 의도를 요청하고 있었고 단지 조각 컨텍스트를 사용해야했습니다.
Uzair

18

많은 필수 조각 (예 : 조각에서 ViewPager를 사용하는 경우)

주요 활동에서 :

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

당신의 조각에서 :

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    for (Fragment fragment : getChildFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}

중첩 된 조각에서

통화 활동

getParentFragment().startActivityForResult(intent, uniqueInstanceInt);

uniqueInstanceInt- 다른 프래그먼트가 응답을 처리하지 못하도록 중첩 된 프래그먼트 중에서 고유 한 int로 바꿉니다 .

응답 받기

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == uniqueInstanceInt ) {
        // TODO your code
    }
}

주의

"requestCode에 하위 16 비트 만 사용할 수 있습니다"오류를 방지하기 위해 uniqueInstanceInt에 0에서 65536 사이의 숫자를 사용해야합니다.


에서 좋은 작품 활동> 조각 (ViewPager)> 조각
올렉산드르 Firsov

14

누군가가 여전히 할 수 없다면 두 가지 조언을 추가 할 수 있습니다. Manifest.xml 파일에서 콜백 할 때 호스팅 활동이 완료되지 않았고 시작될 활동에 표준으로 시작 모드가 있는지 확인하십시오. 아래와 같이 세부 사항을보십시오 :

호스팅 활동의 경우 히스토리 없음 특성을 false로 설정하십시오.

android:noHistory="false"

활동을 시작하려면 시작 모드를 표준으로 설정하십시오 (있는 경우).

android:launchMode="standard"

13

나는의 코드 외부의 블록 이동하면 나 또한 같은 문제에 직면 한 조각을 A와 유틸리티 클래스 로, parentActivity로 전달 된 인수 ,

Intent intent = new Intent(parentActivity, CameraCaptureActivity.class);
parentActivity.startActivityForResult(intent,requestCode);

그런 다음 onActivityResult해당 Fragment의 메소드 에서 아무런 가치도 얻지 못했습니다 . 그 후에 인수Fragment로 변경하여 메소드의 수정 된 정의는 다음과 같습니다.

Intent intent = new Intent(fragment.getContext(), CameraCaptureActivity.class);
fragment.startActivityForResult(intent,requestCode);

그 후, 나는 가치를 얻을 수 있었다 onActivityResult조각


10

나는 또한 조각 에서이 문제를 만났다. 그리고 나는 전화 startActivityForResult했다 DialogFragment.

그러나 이제이 문제는 해결되었습니다
FragmentClassname.this.startActivityForResult .


startActivityForResult(...)조각 코드 내부의 추상 클래스에서 호출했기 때문에 훌륭했습니다 .
빈스

9

필요한 조각 (예 : ViewPager를 사용하는 경우)

주요 활동에서 :

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

기본 최상위 조각 (ViewPager 조각)에서 :

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    YourFragment frag = (YourFragment) getChildFragmentManager().getFragments().get(viewPager.getCurrentItem());
    frag.yourMethod(data);  // Method for callback in YourFragment
    super.onActivityResult(requestCode, resultCode, data);
}

YourFragment에서 (중첩 된 조각) :

public void yourMethod(Intent data){
    // Do whatever you want with your data
}

8

제 경우에는 안드로이드 버그 ( http://technet.weblineindia.com/mobile/onactivityresult-not-getting-called-in-nested-fragments-android/ ) 였습니다 .supported 를 사용하면 다음 대신 FragmentActivity사용해야 getSupportFragmentManager합니다 getChildFragmentManager.

List<Fragment> fragments = getSupportFragmentManager().getFragments();
if (fragments != null) {
    for (Fragment fragment : fragments) {
        if(fragment instanceof UserProfileFragment) {
            fragment.onActivityResult(requestCode, resultCode, data);
        }
    }
}

6

한마디로

조각으로 선언하십시오 Fragment fragment = this.

그 사용 후 fragment.startActivityForResult.

결과는 activityResult에 반환됩니다.


6

해결책 1 :

startActivityForResult(intent, REQUEST_CODE);대신에 전화하십시오 getActivity().startActivityForResult(intent, REQUEST_CODE);.

해결책 2 :

startActivityForResult(intent, REQUEST_CODE);호출되는 액티비티는 onActivityResult(requestCode,resultcode,intent)호출 한 다음 호출 할 수 fragments onActivityResult()을 통과, 여기에서 requestCode, resultCode and intent.


5

조각 내에서 전화

this.startActivityForResult(intent, REQUEST_CODE);

여기서 this조각을 참조합니다. 그렇지 않으면 @Clevester가 말한 것처럼하십시오 :

Fragment fragment = this;
....
fragment.startActivityForResult(intent, REQUEST_CODE);

나도 전화해야 했어

super.onActivityResult(requestCode, resultCode, data);

부모 활동에있어 onActivityResult그것을 작동하게 할 수 있습니다.

(@Clevester의 답변 에서이 답변을 수정했습니다.)


5

사용하는 사람들을 위해 안드로이드 네비게이션 구성 요소 활동의에 사용해야 onActivityResult(...)primaryNavigationFragment이 조각 참조 및 전화 단편의입니다 얻을 수 있습니다 fragment.onActivityResult(...).

활동은 여기 onActivityResult(...)

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

    for (Fragment fragment : getSupportFragmentManager().getPrimaryNavigationFragment().getChildFragmentManager().getFragments())
    {
            fragment.onActivityResult(requestCode, resultCode, imageData);
    }
}

4

이러한 답변의 대부분은 당신이 호출 할 필요가 자꾸 super.onActivityResult(...)호스트에 Activity당신을 위해 Fragment. 그러나 그것은 나를 위해 일하는 것 같지 않았습니다.

따라서 호스트에서는 대신 Activity전화해야 Fragments onActivityResult(...)합니다. 다음은 예입니다.

public class HostActivity extends Activity {

    private MyFragment myFragment;

    protected void onActivityResult(...) {
        super.onActivityResult(...);
        this.myFragment.onActivityResult(...);
    }
}

HostActivity당신의 어느 시점에서 당신 this.myFragmentFragment당신이 사용 하는 할당해야합니다 . 또는를 사용하여 FragmentManagerFragment대한 참조를 유지하는 대신를 사용하십시오 HostActivity. 또한 null을 호출하기 전에 확인 하십시오 this.myFragment.onActivityResult(...);.


3
public class takeimage extends Fragment {

    private Uri mImageCaptureUri;
    private static final int PICK_FROM_CAMERA = 1;
    private static final int PICK_FROM_FILE = 2;
    private String mPath;
    private ImageView mImageView;
    Bitmap bitmap = null;
    View view;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.activity_send_image, container, false);
        final String[] items = new String[] { "From Camera", "From SD Card" };
        mImageView = (ImageView)view.findViewById(R.id.iv_pic);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.select_dialog_item, items);
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Select Image");

        builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {
                if (item == 0) {
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    File file = new File(Environment.getExternalStorageDirectory(), "tmp_avatar_"
                        + String.valueOf(System.currentTimeMillis())
                        + ".jpg");
                    mImageCaptureUri = Uri.fromFile(file);

                    try {
                        intent.putExtra(
                            android.provider.MediaStore.EXTRA_OUTPUT,
                            mImageCaptureUri);
                        intent.putExtra("return-data", true);

                        getActivity().startActivityForResult(intent,
                            PICK_FROM_CAMERA);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    dialog.cancel();
                } else {
                    Intent intent = new Intent();

                    intent.setType("image/*");
                    intent.setAction(Intent.ACTION_GET_CONTENT);

                    getActivity().startActivityForResult(
                        Intent.createChooser(intent,
                            "Complete action using"), PICK_FROM_FILE);
                }
            }
        });
        final AlertDialog dialog = builder.create();

        Button show = (Button) view.findViewById(R.id.btn_choose);
        show.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // Switch the tab content to display the list view.
                dialog.show();
            }
        });

    return view;
    }

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

        if (resultCode != Activity.RESULT_OK)
            return;

        if (requestCode == PICK_FROM_FILE) {
            mImageCaptureUri = data.getData();
            // mPath = getRealPathFromURI(mImageCaptureUri); //from Gallery

            if (mPath == null)
                mPath = mImageCaptureUri.getPath(); // from File Manager

            if (mPath != null)
                bitmap = BitmapFactory.decodeFile(mPath);
        } else {
            mPath = mImageCaptureUri.getPath();
            bitmap = BitmapFactory.decodeFile(mPath);
        }
        mImageView.setImageBitmap(bitmap);  
    }

    public String getRealPathFromURI(Uri contentUri) {
        String [] proj = {MediaStore.Images.Media.DATA};
        Cursor cursor = managedQuery(contentUri, proj, null, null,null);

        if (cursor == null) return null;

        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
} 

3
  1. onActivityResult조각에서 BaseActivity 를 무시할 수 있습니다 baseActivity.startActivityForResult.

  2. BaseActivity에서 인터페이스를 추가하고 onActivityResult를 대체하십시오.

    private OnBaseActivityResult baseActivityResult;
    public static final int BASE_RESULT_RCODE = 111;
    public interface OnBaseActivityResult{
        void onBaseActivityResult(int requestCode, int resultCode, Intent data);
       }
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(getBaseActivityResult() !=null && requestCode == BASE_RESULT_RCODE){
        getBaseActivityResult().onBaseActivityResult(requestCode, resultCode, data);
        setBaseActivityResult(null);
    }
  3. 조각 구현 OnBaseActivityResult

    @Override
    public void onBaseActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d("RQ","OnBaseActivityResult");
    if (data != null) {
        Log.d("RQ","OnBaseActivityResult + Data");
        Bundle arguments = data.getExtras();
      }
    }

이 해결 방법은 트릭을 수행합니다.


3

위의 문제가 Facebook 로그인에 직면 하면 다음 코드를 조각의 부모 활동에 사용할 수 있습니다.

Fragment fragment = getFragmentManager().findFragmentById(android.R.id.tabcontent);
fragment.onActivityResult(requestCode, resultCode, data);

또는:

Fragment fragment = getFragmentManager().findFragmentById("fragment id here");
fragment.onActivityResult(requestCode, resultCode, data);

그리고 조각에 아래의 호출을 추가하십시오 ...

callbackManager.onActivityResult(requestCode, resultCode, data);

2

다른 답변에 아직 설명되지 않은 또 다른 유스 케이스 :

onActivityResult()다음을 사용할 때 조각으로 선언 된 호출되지 않습니다 exception.startResolutionForResult().

if (exception is ResolvableApiException) {
    exception.startResolutionForResult(activity!!, MY_REQUEST_CODE)
}

이 경우 exception.startResolutionForResult()조각으로 대체하십시오 startIntentSenderForResult().

if (exception is ResolvableApiException) {
    startIntentSenderForResult(exception.resolution.intentSender, MY_REQUEST_CODE, null, 0, 0, 0, null)
}

2

Kotlin 버전 (활동의 onActivityResult ())

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    //add following lines in your activity
    if(supportFragmentManager?.fragments!=null && supportFragmentManager?.fragments!!.size>0)
     for (i in 0..supportFragmentManager?.fragments!!.size-1) {
         val fragment= supportFragmentManager?.fragments!!.get(i)
         fragment.onActivityResult(requestCode, resultCode, data)
    }
 }


1

나는 여기의 모든 대답이 해킹에 지나지 않는다는 강한 의혹을 가지고 있습니다. 나는 그들 모두와 다른 많은 것들을 시도했지만 항상 어리석은 문제가 있기 때문에 신뢰할만한 결론없이. 나는 일관성이없는 결과에 의존 할 수 없다. Fragments에 대한 공식 Android API 설명서를 보면 Google에 다음 사항이 명확하게 표시되어 있습니다.

프래그먼트가 포함 된 활동에서 startActivityForResult (Intent, int)를 호출하십시오.

참조 : Android Fragment API

따라서 가장 정확하고 안정적인 방법은 실제로 호스팅 활동에서 startActivityForResult () 를 호출 하고 결과 onActivityResult () 를 처리하는 것입니다.


2
"활동에서 call startActivityForResult"가 권장 사항이라고 생각하지 않습니다. 당신이 조각의 기본 클래스 내부의 구현을 보면, 그것은이하는 모든 것입니다 mActivity.startActivityFromFragment(this, intent, requestCode)- 그것은 아무것도하지만 간이 래퍼 없도록
안티 Veeranna

1

코드에 중첩 된 조각이 있습니다. super.onActivityForResult 호출이 작동하지 않습니다

프래그먼트가 호출 될 수있는 모든 활동을 수정하거나 프래그먼트 체인의 모든 프래그먼트를 호출하는 문제를 해결하고 싶지는 않습니다.

다음은 많은 작업 솔루션 중 하나입니다. 즉시 조각을 작성하고 지원 조각 관리자를 사용하여 활동에 직접 연결하십시오. 그런 다음 새로 작성된 프래그먼트에서 startActivityForResult를 호출하십시오.

private void get_UserEmail() {

    if (view == null) {
        return;
    }
    ((TextView) view.findViewById(R.id.tvApplicationUserName))
            .setText("Searching device for user accounts...");

    final FragmentManager fragManager = getActivity().getSupportFragmentManager();

    Fragment f = new Fragment() {
        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
            startActivityForResult(AccountPicker.newChooseAccountIntent(null, null,
                    new String[]{"com.google"}, false, null, null, null, null), REQUEST_CODE_PICK_ACCOUNT);
        }

        @Override
        public void onActivityResult(int requestCode, int resultCode,
                                     Intent data) {
            if (requestCode == REQUEST_CODE_PICK_ACCOUNT) {
                String mEmail = "";
                if (resultCode == Activity.RESULT_OK) {
                    if (data.hasExtra(AccountManager.KEY_ACCOUNT_NAME)) {
                        mEmail = data
                                .getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
                    }
                }
                if (mActivity != null) {
                    GoPreferences.putString(mActivity, SettingApplication.USER_EMAIL, mEmail);
                }
                doUser();
            }
            super.onActivityResult(requestCode, resultCode, data);
            fragManager.beginTransaction().remove(this).commit();
        }
    };
    FragmentTransaction fragmentTransaction = fragManager
            .beginTransaction();
    fragmentTransaction.add(f, "xx" + REQUEST_CODE_PICK_ACCOUNT);
    fragmentTransaction.commit();
}

이것은 실제로 작동하며 그것에 대한 투표는 하나뿐입니다. 즉시 조각을 만듭니다. 너무 쉽지만 진정한 작업 솔루션입니다. 누군가 나를 위해 편집하려고했습니다.
danny117

1

내 문제는 호스트 활동에 관한 문제였습니다. 세트로 찾았 android:launchMode="standard"습니다. 일시적으로 제거했습니다.


1

mention호스트 활동 시작 모드singleInstance또는로 설정되어서는 안되는 한 가지 포인트가 없습니다 singleTask.

시작 모드가 SingleInstance 또는 SingleTask로 설정된 경우 onActivityResult가 작동하지 않습니다. 또는 이러한 IntentFilters를 사용하여 활동을 호출

standard또는 singleTop시작 모드가 제대로 작동합니다.


1

중첩 조각을 사용하는 경우에도 작동합니다.

getParentFragment().startActivityForResult(intent, RequestCode);

이 외에도 super.onActivityResult부모 활동에서 호출 onActivityResult하여 조각 의 메소드를 작성해야합니다 .


1

나는 확장하는 기본 클래스를 작성하여 문제를 처리하는 한 Fragment, 그리고에서 onactivityresult나는를 사용하여 현재 실행중인 조각을 발견 한 활동 fragmenttag. 그런 다음 fragmentbase 클래스에서 사용자 정의 메소드를 호출합니다. 현재 실행중인 프래그먼트에서 이벤트를 발생시킵니다.

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