TabHost 활동에서 결과 (startActivityForResult)를 반환하는 방법은 무엇입니까?


275

내 예제에는 3 가지 수업이 있습니다. 주요 활동 인 A 등급. 클래스 A는 startActivityForResult를 호출합니다.

Intent intent = new Intent(this, ClassB.class);
startActivityForResult(intent, "STRING");

클래스 B,이 클래스는 TabActivity입니다.

Intent intent = new Intent(this, ClassC.class);
tabHost.addTab...

클래스 C,이 클래스는 일반적인 활동입니다.

Intent intent = this.getIntent();
intent.putExtra("SOMETHING", "EXTRAS");
this.setResult(RESULT_OK, intent);
finish();

onActivityResult는 클래스 A에서 호출되지만 resultCode RESULT_CANCELED대신에 RESULT_OK리턴 된 의도가 널입니다. TabHost 내부의 활동에서 무언가를 어떻게 반환합니까?

문제는 클래스 C가 실제로 클래스 B 내부에서 실행 중이고 클래스 B가 RESULT_CANCELED클래스 A로 되돌아가는 것입니다. 아직 해결 방법을 모르겠습니다.

답변:


366

세상에! 몇 시간을 보내고 Android 소스를 다운로드 한 후 마침내 해결책을 찾았습니다.

Activity 클래스를 보면 속성이로 설정된 finish()경우에만 해당 메소드가 결과를 다시 보냅니다 . 그렇지 않으면 결과가 손실됩니다.mParentnull

public void finish() {
    if (mParent == null) {
        int resultCode;
        Intent resultData;
        synchronized (this) {
            resultCode = mResultCode;
            resultData = mResultData;
        }
        if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken);
        try {
            if (ActivityManagerNative.getDefault()
                .finishActivity(mToken, resultCode, resultData)) {
                mFinished = true;
            }
        } catch (RemoteException e) {
            // Empty
        }
    } else {
        mParent.finishFromChild(this);
    }
}

따라서 내 솔루션은 다음과 같은 경우 부모 활동에 결과를 설정하는 것입니다.

Intent data = new Intent();
 [...]
if (getParent() == null) {
    setResult(Activity.RESULT_OK, data);
} else {
    getParent().setResult(Activity.RESULT_OK, data);
}
finish();

누군가이 문제 해결 방법을 다시 찾으면 도움이되기를 바랍니다.


1
여기에 해키 솔루션을 게시했습니다. 간단하고 내용이없는 투명한 활동이 포함되어 있습니다. 정상적인 수명주기 기능을 얻고 모든 것을 쉽게 만듭니다. stackoverflow.com/questions/7812120/…
CQM

대단해! 감사합니다 감사합니다 감사합니다! 그것은 완벽하고 아주 소란스럽게 작동합니다. 이 작은 보석으로 모든 활동에 대한 일반 setResult () 메소드를 재정의했습니다. 감사합니다!
Scott Biggs

나는 당신의 솔루션을 사용했지만 여전히 내 코드는 돌아올 때 onactivityresult 메소드를 잡지 않습니다. 도와주세요 .. 다른 것을 사용해야합니까?
skygeek

11
API 안내서의 어느 곳에도 문서화되지 않은 액티비티에서 결과를 반환하는 이유가 이상합니다.
alex.p

제길! 잘 했어, 일리아! 감사합니다
Sirelon

64

http://tylenoly.wordpress.com/2010/10/27/how-to-finish-activity-with-results/

"param_result"를 약간 수정 함

/* Start Activity */
public void onClick(View v) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setClassName("com.thinoo.ActivityTest", "com.thinoo.ActivityTest.NewActivity");
    startActivityForResult(intent,90);
}
/* Called when the second activity's finished */
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(requestCode) {
    case 90:
        if (resultCode == RESULT_OK) {
            Bundle res = data.getExtras();
            String result = res.getString("param_result");
            Log.d("FIRST", "result:"+result);
        }
        break;
    }
}

private void finishWithResult()
{
    Bundle conData = new Bundle();
    conData.putString("param_result", "Thanks Thanks");
    Intent intent = new Intent();
    intent.putExtras(conData);
    setResult(RESULT_OK, intent);
    finish();
}

2
간단했습니다 setResult. 예를 들어 무언가 또는 값으로 설정하면 RESULT_OK좋습니다. setResult(RESULT_OK);. 도와주세요, +1
Afzaal Ahmad Zeeshan

16

의도 : FLAG_ACTIVITY_FORWARD_RESULT?

기존 활동에서 새 활동을 시작하는 데 설정하고이 의도를 사용하는 경우 기존 활동의 응답 대상이 새 활동으로 전송됩니다.


1

클래스 B에서도 onActivityResult를 구현하고 startActivityForResult를 사용하여 클래스 C를 시작할 수 있습니다. 클래스 B에서 결과를 얻은 다음 클래스 C의 결과를 기반으로 결과를 클래스 A에 대해 설정하십시오. 나는 이것을 시도하지 않았지만 이것이 효과가 있다고 생각합니다.

주의해야 할 또 다른 사항은 활동 A가 단일 인스턴스 활동이 아니어야한다는 것입니다. startActivityForResult가 작동하려면 클래스 B가 활동 A에 대한 하위 활동이어야하고 단일 인스턴스 활동에서는 불가능하기 때문에 새 활동 (클래스 B)이 새 태스크에서 시작됩니다.


1
클래스 B는 TabActivity이고 클래스 C는 해당 활동의 탭이므로 클래스 B에서는 startActivityForResult를 수행 할 수 없습니다. 내 활동 중 단일 인스턴스 활동이 아닙니다.
Cameron McBride

-1

활동 1에서 활동 2를 시작하고 결과를 얻으려면 startActivityForResult를 사용하고 활동 1에서 onActivityResult를 구현하고 활동 2에서 setResult를 사용할 수 있습니다.

Intent intent = new Intent(this, Activity2.class);
intent.putExtra(NUMERO1, numero1);
intent.putExtra(NUMERO2, numero2);
//startActivity(intent);
startActivityForResult(intent, MI_REQUEST_CODE);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.