내 예제에는 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()
경우에만 해당 메소드가 결과를 다시 보냅니다 . 그렇지 않으면 결과가 손실됩니다.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);
}
}
따라서 내 솔루션은 다음과 같은 경우 부모 활동에 결과를 설정하는 것입니다.
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);