programing

onActivityResult가 fragment에서 호출되지 않습니다.

closeapi 2023. 6. 5. 23:55
반응형

onActivityResult가 fragment에서 호출되지 않습니다.

이 조각을 호스팅하는 활동은 다음과 같습니다.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);
    }
}

은 호스활재됩니다의정이를 재정의합니다.onActivityResult()하지만 그것은 전화를 하지 않았습니다.super.onActivityResult()처리되지 않은 결과 코드의 경우.보아하니, 비록 그 조각이 그를 만드는 것이지만.startActivityForResult()호출, 활동은 결과를 처리하는 첫 번째 기회를 얻습니다.이것은 조각의 모듈화를 고려할 때 의미가 있습니다.가 후한현을 했을 때super.onActivityResult()처리되지 않은 모든 결과에 대해, 조각은 결과를 처리할 수 있는 기회를 얻었습니다.

그리고 @siqing 답변에서도 다음과 같이 답합니다.

파편에 대한 결과를 얻으려면 전화를 해야 합니다.startActivityForResult(intent,111);getActivity().startActivityForResult(intent,111);당신의 파편 안에.

하신 것 요.getActivity().startActivityForResult(intent,111);당신은 보화해에 전화해야 .startActivityForResult(intent,111);.

옵션 1:

전화하시는 경우startActivityForResult()그 파편에서 전화를 해야 합니다.startActivityForResult(),것은 아니다.getActivity().startActivityForResult()Activity Result()는 fragment입니다.

어디로 전화를 건 건지 잘 모르실 경우startActivityForResult()그리고 당신이 어떻게 메소드를 호출할 것인지.

옵션 2:

은 활은다음결얻과때다기의 를 얻기 입니다.onActivityResult()활동의 작업을 재정의해야 합니다.onActivityResult() 와를 요.super.onActivityResult()처리되지 않은 결과 코드에 대해 또는 모두에 대해 각 fragment로 전파합니다.

위의 두 가지 옵션이 작동하지 않으면 옵션 3을 참조하십시오. 확실히 작동합니다.

옵션 3:

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

상위 활동 클래스에서 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
}

활동에서 조각을 모르는 경우, 모든 조각을 열거하고 활동 결과 인수를 전송합니다.

//자바

// 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);
    }
}

//코틀린

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        for (fragment in supportFragmentManager.fragments) {
            fragment.onActivityResult(requestCode, resultCode, data)
        }
    }

를 안고 있습니다.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);
    }
}

원래 게시물.

FragmentActivity를 대체합니다.requestCode수정된 것으로그 후에, 언제onActivityResult()FragmentActivity상위 16비트를 구문 분석하고 원본 Fragment의 인덱스를 복원합니다.체계를 : 성구표를보십오시이오.

여기에 이미지 설명 입력

루트 레벨에 몇 개의 조각이 있으면 문제가 없습니다.그러나 예를 들어, 중첩된 조각이 있는 경우Fragment에 탭이 몇개있는 안에 몇 의 탭이 ViewPager문제에 직면할 것임을 보장합니다(또는 이미 직면했습니다).

내부에 인덱스가 하나만 저장되어 있기 때문입니다.requestCode그것은 의 색인입니다.Fragment 부에 에.FragmentManager중첩된 조각을 사용하는 경우 하위 조각이 있습니다.FragmentManagerfragments 목록인 fragment 목고있이다니를 의 전체 따서서에시여작전하체합니다저장체부터 저장해야 합니다FragmentManager.

여기에 이미지 설명 입력

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

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

Android Navigation Component를 사용하는 사용자는 활동에서 를 사용해야 합니다.onActivityResult(...)그자리의 primaryNavigationFragmentfragment를 합니다.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);
    }
}

여러 중첩된 조각의 경우(예: 조각에서 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 - 다른 fragment가 응답을 처리하지 않도록 중첩된 fragment 중에서 고유한 int로 대체합니다.

응답 수신

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

주의

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

는 또한 이 코드 블록을 프래그먼트 외부의 유틸리티 클래스로 이동했을 때 같은 문제에 직면했습니다.parentActivity논쟁으로 통과되었습니다.

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

그 후에 저는 어떤 가치도 얻지 못했습니다.onActivityResult 프래그먼트의 방법, 그 후에, 나는 주장을 프래그먼트로 바꾸었고, 그래서 방법의 개정된 정의는 다음과 같이 보였습니다.

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

그 후, 저는 가치를 얻을 수 있었습니다.onActivityResult단편 위에

Mohit Mehta의 답변에 영감을 받아 Android Navigation Component를 사용하는 사람들을 위한 Kotlin 버전.

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    supportFragmentManager.primaryNavigationFragment?.childFragmentManager?.fragments?.forEach { fragment ->
        fragment.onActivityResult(requestCode, resultCode, data)
    }
}

만약 누군가가 여전히 그것을 할 수 없다면 나는 두 가지 조언을 추가할 수 있습니다.Manifest.xml 파일에서 콜백할 때 호스팅 작업이 완료되지 않았는지, 시작할 작업이 시작 모드를 표준으로 가지고 있는지 확인합니다.아래와 같이 세부 정보를 참조하십시오.

Hosting 활동의 경우 no history 속성이 있으면 false로 설정합니다.

android:noHistory="false"

시작할 활동에 대해 시작 모드를 표준으로 설정합니다.

android:launchMode="standard"

중첩된 조각의 경우(예: 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);
}

당신의 단편(내포된 단편)에서:

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

저는 또한 단편에서 이 문제를 만났습니다.그리고 전화했습니다.startActivityForResult순식간에DialogFragment.

하지만 이제 이 문제는 해결되었습니다.
FragmentClassname.this.startActivityForResult.

저의 경우 안드로이드 버그였습니다(지원되는 제품을 사용하는 경우 http://technet.weblineindia.com/mobile/onactivityresult-not-getting-called-in-nested-fragments-android/), ).FragmentActivity은 야합니다해사를 사용해야 .getSupportFragmentManagergetChildFragmentManager:

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

요컨대,

조으로선니다합언각다니,▁declare▁in▁fragment합을 선언합니다.Fragment fragment = this;

에는 그사후용을 합니다.fragment.startActivityForResult.

결과는 작업 결과로 반환됩니다.

솔루션 1:

startActivityForResult(intent, REQUEST_CODE);getActivity().startActivityForResult(intent, REQUEST_CODE);.

솔루션 2:

startActivityForResult(intent, REQUEST_CODE);의 라합니다고이활라고 .onActivityResult(requestCode,resultcode,intent)호출되면 전화를 걸 수 있습니다.fragments onActivityResult()여기서, 를 지나갑니다.

당신의 파편 안에서, 전화하세요.

this.startActivityForResult(intent, REQUEST_CODE);

this @그렇지 않으면 @Clevester가 말한 대로 합니다.

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

저도 전화를 해야 했습니다.

super.onActivityResult(requestCode, resultCode, data);

모부활동중에서.onActivityResult효과가 있을 거예요

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

Android의 Navigation 구성 요소의 경우, 중첩된 Fragment가 있을 때 이 문제는 해결할 수 없는 미스터리처럼 느껴질 수 있습니다.

이 게시물의 다음 답변에서 얻은 지식과 영감을 바탕으로 효과적인 간단한 솔루션을 구성할 수 있었습니다.

onActivityResult()당신은 당신이 사용하는 활성 프래그먼트 목록을 루프할 수 있습니다.FragmentManagergetFragments()방법.

작업을 수행하려면 다음을 사용해야 합니다.getSupportFragmentManager()또는 API 26 이상을 대상으로 합니다.

하는 것은 각 하는 목록을 입니다.instanceof.

하는 동안에FragmentComponent를 에 Android Navigation Component라는NavHostFragment.

그럼 이제 어떻게 하죠?프래그먼트를 그들에게 알려야 합니다NavHostFragment.NavHostFragment그 자체가 파편입니다.그래서 사용하기getChildFragmentManager().getFragments()우리는 다시 한 번 a를 얻습니다.List<Fragment>우리에게 알려진 파편의.NavHostFragment는 그 해서 확인합니다.instanceof각 조각.

일단 우리가 관심의 조각을 목록에서 찾으면, 우리는 그것을 그것이라고 부릅니다.onActivityResult() onActivityResult()라고 선언합니다.

//  Your activity's onActivityResult()

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

        List<Fragment> lsActiveFragments = getSupportFragmentManager().getFragments();
        for (Fragment fragmentActive : lsActiveFragments) {

            if (fragmentActive instanceof NavHostFragment) {

                List<Fragment> lsActiveSubFragments = fragmentActive.getChildFragmentManager().getFragments();
                for (Fragment fragmentActiveSub : lsActiveSubFragments) {

                    if (fragmentActiveSub instanceof FragWeAreInterestedIn) {
                        fragmentActiveSub.onActivityResult(requestCode, resultCode, data);
                    }

                }

            }

        }

    }

이 대답들의 대부분은 계속해서 당신이 전화해야 한다고 말합니다.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.myFragment그자리의 Fragment사용 중입니다.또는 다음을 사용합니다.FragmentManager을 얻기 위해Fragment그것에 대한 언급을 당신의 안에 두는 대신에.HostActivity또한 다음 항목을 확인합니다.null전화하기 전에this.myFragment.onActivityResult(...);.

다른 답변에 아직 설명되지 않은 다른 사용 사례:

onActivityResult()된 fragment는 fragment를 할 때 .exception.startResolutionForResult():

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

이 이경대체로 합니다.exception.startResolutionForResult()fragment 적으로편단▁.startIntentSenderForResult():

if (exception is ResolvableApiException) {
    startIntentSenderForResult(exception.resolution.intentSender, MY_REQUEST_CODE, null, 0, 0, 0, null)
}
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);
    }
} 
  1. 기본 활동을 재정의할 수 있습니다.onActivityResultbaseActivity.startActivityForResult.

  2. 기본 활동에서 인터페이스를 추가하고 활동 결과를 재정의합니다.

    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. Fragment는 단적인에대하를 합니다.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();
      }
    }
    

이 해결 방법으로 해결할 수 있습니다.

Facebook 로그인 시 위의 문제가 발생하면 다음과 같은 fragment의 부모 활동에 아래 코드를 사용할 수 있습니다.

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

Kotlin 버전(활동 결과())

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

추가할 내용

public void onClick(View v) {   
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, 1);
}

당신이 당신의 코드를 위의 코드로 대체할 때 자동으로 당신의 이것.

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

메서드가 작동을 시작합니다.

//No Need to write this code in onclick method
    Intent intent=new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT)
    startActivityForResult(intent,1);
    Toast.makeText(getContext(), "image"+intent, Toast.LENGTH_SHORT).show();

@Mohit @ Mehta의 도움을 Mehta를 합니다.Navigation Component이것은 당신에게도 도움이 될 것입니다.제게 효과가 있었습니다.

onActivityResultMainActivity코드 아래에 붙여넣기:

for (Fragment fragment : navHostFragment.getChildFragmentManager().getFragments()){
        if (fragment != null){
            Log.d(TAG, "onResult Has Been Sent!");
            fragment.onActivityResult(requestCode, resultCode, data);
        }
    }

그고리로.onActivityResultYOUR FRAGMENT당신은 결과를 얻을 수 있습니다.이것이 도움이 되길 바랍니다.

우선 활동에서 이 코드를 재정의해야 합니다.

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

그리고 나서, 당신의 단편에서

startActivityForResult(intent,GALLERY_REQUEST_CODE);

그리고 당신의 단편에서보다 더,

@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    // Result code is RESULT_OK only if the user selects an Image
    if (resultCode == Activity.RESULT_OK) {

    }

}

Olie C가 언급했듯이, 중첩된 조각을 사용할 때 onActivityResult에 반환된 값을 사용하는 지원 라이브러리에 대한 활성 버그가 있습니다.방금 쳤어요 :-(

requestCode != 0일 때 Fragment.onActivityResult가 호출되지 않음을 참조하십시오.

저는 여기에 있는 모든 답들이 해킹에 지나지 않는다는 강한 의심을 가지고 있습니다.저는 그것들을 모두 시도해보았지만, 항상 어리석은 문제가 있기 때문에 신뢰할 수 있는 결론은 얻지 못했습니다.나로서는 일관성 없는 결과에 의존할 수 없습니다.Fragments의 공식 Android API 문서를 보면 Google은 다음과 같이 명시되어 있습니다.

조각에 포함된 활동에서 결과에 대한 시작 활동(Intent, int)을 호출합니다.

참조: Android Fragment API

따라서 호스팅 활동에서 startActivityForResult()실제로 호출하고 여기서 ActivityResult()에 대한 결과를 처리하는 것이 가장 올바르고 신뢰할 수 있는 접근 방식인 것 같습니다.

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

조각을 호출할 수 있는 모든 활동을 수정하거나 조각 체인의 모든 조각을 호출하는 작업을 수행할 수 없습니다.

다음은 작동하는 많은 솔루션 중 하나입니다.즉시 조각을 만들어 지원 조각 관리자와 함께 활동에 직접 연결합니다.그런 다음 새로 만든 조각에서 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();
}

언급URL : https://stackoverflow.com/questions/6147884/onactivityresult-is-not-being-called-in-fragment

반응형