티스토리 뷰
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
'개발 > 안드로이드' 카테고리의 다른 글
안드로이드에서 파일의 MIME 타입 확인하기 (0) | 2023.01.04 |
---|---|
인터넷 연결 확인하기 (0) | 2023.01.04 |
인텐트의 모든 extra 데이터 출력하기 (0) | 2023.01.03 |
'ACTION-VIEW 인텐트 필터가 있는 적어도 하나의 액티비티 추가' 경고 수정하기 (0) | 2023.01.01 |
모든 이전 액티비티 종료하기 (0) | 2023.01.01 |