programing

TabHost Activity에서 결과(ActivityForResult 시작)를 반환하는 방법은 무엇입니까?

closeapi 2023. 11. 7. 20:52
반응형

TabHost Activity에서 결과(ActivityForResult 시작)를 반환하는 방법은 무엇입니까?

저는 예를 들어 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반환된 의도는 null입니다.TabHost 내의 Activity에서 무언가를 반환하려면 어떻게 해야 합니까?

문제는 C반이 실제로 B반 안에서 운영되고 있다는 것과 B반이 그것을 돌려주는 것이라는 것을 알고 있습니다.RESULT_CANCELED다시 A급으로.저는 아직 일을 잘 모릅니다.

오, 하나님!몇 시간을 들여 안드로이드 소스를 다운로드한 끝에 드디어 해결책을 찾았습니다.

Activity 클래스를 보면 다음을 보실 수 있습니다.finish()method는 다음이 있는 경우에만 결과를 다시 보냅니다.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();
}

Intent.FLAG_ACTIVE_FORWARD_RESULT?

이 목적이 설정되어 있고 기존 활동에서 새 활동을 시작하는 데 사용되는 경우, 기존 활동의 회신 대상이 새 활동으로 옮겨집니다.

클래스 B에서도 ActivityResult를 구현하고 startActivityForResult를 사용하여 클래스 C를 시작할 수 있습니다.클래스 B에서 결과를 얻으면 클래스 C의 결과를 기반으로 클래스 A의 결과를 설정합니다.저는 이것을 시도해 본 적은 없지만 이것은 효과가 있을 것 같습니다.

또 다른 주의해야 할 점은 활동 A가 단일 인스턴스 활동이 되어서는 안 된다는 것입니다.StartActivityForResult가 작동하려면 클래스 B가 액티비티 A의 하위 액티비티여야 하며 단일 인스턴스 액티비티에서는 불가능하므로 새 액티비티(클래스 B)가 새 태스크에서 시작됩니다.

Activity 1에서 Activity 2를 시작하고 결과를 얻는 경우, start ActivityForResult를 사용하고 Activity 1에서 ActivityResult를 구현하고 Activity2에서 setResult를 사용할 수 있습니다.

Intent intent = new Intent(this, Activity2.class);
intent.putExtra(NUMERO1, numero1);
intent.putExtra(NUMERO2, numero2);
//startActivity(intent);
startActivityForResult(intent, MI_REQUEST_CODE);

언급URL : https://stackoverflow.com/questions/2497205/how-to-return-a-result-startactivityforresult-from-a-tabhost-activity

반응형