티스토리 뷰

반응형

Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.

Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.

 

아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.

How to return a result (startActivityForResult) from a TabHost Activity?

탭 호스트 액티비티에서 결과(startActivityForResult)를 반환하는 방법은 무엇인가요?

 문제 내용 

I have 3 classes in my example: Class A, the main activity. Class A calls a startActivityForResult:

제 예제에는 3개의 클래스가 있습니다: Class A(주요 액티비티), Class A는 startActivityForResult를 호출합니다.
Intent intent = new Intent(this, ClassB.class);
startActivityForResult(intent, "STRING");

 

Class B, this class is a TabActivity:

Class B는 TabActivity입니다.
Intent intent = new Intent(this, ClassC.class);
tabHost.addTab...

 

Class C, this class is a regular Activity:

Class C는 보통의 Activity입니다.
Intent intent = this.getIntent();
intent.putExtra("SOMETHING", "EXTRAS");
this.setResult(RESULT_OK, intent);
finish();

 

onActivityResult is called in Class A, but the resultCode is RESULT_CANCELED instead of RESULT_OK and the returned intent is null. How do I return something from the Activity inside a TabHost?

onActivityResult는 Class A에서 호출됩니다. 하지만 resultCode는 RESULT_OK 대신에 RESULT_CANCELED이고 반환된 인텐트는 null입니다. TabHost 내부의 Activity에서 무언가를 반환하는 방법은 무엇인가요?

 

I realize that the problem is that my Class C is actually running inside of Class B, and Class B is what is returning the RESULT_CANCELED back to Class A. I just don't know a work around yet.

제 Class C가 사실상 Class B 내에서 실행되고 있기 때문에 문제가 되고 있음을 깨달았습니다. 결과적으로 Class B가 RESULT_CANCELED를 Class A로 반환하고 있습니다. 그렇다면 이를 해결할 방법이 없을까요

 

 

 

 높은 점수를 받은 Solution 

Oh, god! After spending several hours and downloading the Android sources, I have finally come to a solution.

오, 하나님! 몇 시간 동안 안드로이드 소스를 내려받아서 결국 해결책을 찾았어요.

 

If you look at the Activity class, you will see, that finish() method only sends back the result if there is a mParent property set to null. Otherwise the result is lost.

만약 Activity 클래스를 살펴보면, finish() 메소드가 mParent 속성이 null일 경우에만 결과를 반환한다는 것을 알 수 있습니다. 그렇지 않으면 결과가 손실됩니다.
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);
    }
}

 

So my solution is to set result to the parent activity if present, like that:

그래서 내 솔루션은 다음과 같이 부모 액티비티가 존재할 경우 부모 액티비티로 결과를 설정하는 것입니다.
Intent data = new Intent();
 [...]
if (getParent() == null) {
    setResult(Activity.RESULT_OK, data);
} else {
    getParent().setResult(Activity.RESULT_OK, data);
}
finish();

 

I hope that will be helpful if someone looks for this problem workaround again.

이 해결책을 찾는 누군가에게 도움이 되길 바랍니다.

 

 

 

 가장 최근 달린 Solution 

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

With a slight modification for "param_result"

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

 

 

출처 : https://stackoverflow.com/questions/2497205/how-to-return-a-result-startactivityforresult-from-a-tabhost-activity

반응형
댓글
공지사항
최근에 올라온 글