TabHost 활동에서 결과 (startActivityForResult)를 반환하는 방법은 무엇입니까? this.getIntent(); intent.putExtra(“SOMETHING”, “EXTRAS”); this.setResult(RESULT_OK, intent); finish(); onActivityResult는 클래스 A에서

내 예제에는 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로 되돌아가는 것입니다. 아직 해결 방법을 모르겠습니다.



답변

세상에! 몇 시간을 보내고 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();

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


답변

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

답변

의도 : FLAG_ACTIVITY_FORWARD_RESULT?

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


답변

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

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


답변

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