TabHost Etkinliğinden bir sonuç (startActivityForResult) nasıl döndürülür?


275

Örneğimde 3 sınıf var: A sınıfı, ana faaliyet. A sınıfı bir startActivityForResult öğesini çağırır:

Intent intent = new Intent(this, ClassB.class);
startActivityForResult(intent, "STRING");

Sınıf B, bu sınıf bir TabActivity:

Intent intent = new Intent(this, ClassC.class);
tabHost.addTab...

C Sınıfı, bu sınıf düzenli bir Faaliyettir:

Intent intent = this.getIntent();
intent.putExtra("SOMETHING", "EXTRAS");
this.setResult(RESULT_OK, intent);
finish();

Sınıf A'da onActivityResult çağrılır, ancak sonuçKodu RESULT_CANCELEDyerine kullanılır RESULT_OKve döndürülen amaç boştur. TabHost içindeki Etkinlik'ten bir şeyi nasıl döndürürüm?

Sorunun, C Sınıfımın aslında B Sınıfının içinde çalıştığının ve B Sınıfının, RESULT_CANCELEDgeri A Sınıfına geri dönen şey olduğunun farkındayım.

Yanıtlar:


366

Aman Tanrım! Birkaç saat geçirdikten ve Android kaynaklarını indirdikten sonra sonunda bir çözüm buldum.

Activity sınıfına bakarsanız, göreceksiniz ki, bu finish()yöntem yalnızca bir mParentözellik ayarlanmışsa sonucu geri gönderir null. Aksi takdirde sonuç kaybolur.

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

Bu yüzden benim çözümüm, eğer varsa, ana faaliyetin sonucunu ayarlamaktır:

Intent data = new Intent();
 [...]
if (getParent() == null) {
    setResult(Activity.RESULT_OK, data);
} else {
    getParent().setResult(Activity.RESULT_OK, data);
}
finish();

Birisi tekrar bu sorun geçici çözüm ararsa yararlı olacağını umuyoruz.


1
Burada hacky bir çözüm yayınladım, basit ve içeriği olmayan şeffaf bir etkinlik içeriyor - normal yaşam döngüsü işlevleri alıyor ve her şeyi kolaylaştırıyor. stackoverflow.com/questions/7812120/…
CQM

Bu harika! Teşekkürler teşekkürler teşekkürler! Mükemmel ve çok az yaygara ile çalışır. Bu küçük gem ile tüm Etkinliklerim için düzenli setResult () yöntemlerini geçersiz kıldım. Teşekkür ederim!
Scott Biggs

Çözümünüzü kullandım, yine de kodum geri geldiğinde onactivityresult yöntemini yakalamıyor. lütfen bana yardım et .. başka bir şey kullanmam gerekiyor mu?
skygeek

11
API kılavuzlarının hiçbir yerinde belgelenmeyen bir Etkinliğin sonucunu neden döndürüyorum, garip geldi.
alex.p

Lanet olsun! Aferin Illya! Teşekkürler
Sirelon

64

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

"Param_result" için küçük bir değişiklikle

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

2
Basit, setResultasıl şeydi. Bir şeye veya örneğin bir değere ayarlayın RESULT_OKve gitmekte fayda var; setResult(RESULT_OK);. Bana yardımcı oldu, +1
Afzaal Ahmad Zeeshan

16

Intent.FLAG_ACTIVITY_FORWARD_RESULT?

Ayarlanmışsa ve bu amaç mevcut bir aktiviteden yeni bir aktivite başlatmak için kullanılıyorsa, mevcut aktivitenin cevap hedefi yeni aktiviteye aktarılır.


1

Sınıf B'de de bir onActivityResult uygulayabilir ve startActivityForResult kullanarak Sınıf C'yi başlatabilirsiniz. B Sınıfı sonucu aldıktan sonra (C Sınıfı için) C Sınıfı sonucuna göre sonucu orada ayarlayın. Bunu denemedim ama bunun çalışması gerektiğini düşünüyorum.

Dikkat edilmesi gereken başka bir şey, Etkinlik A'nın tek bir Etkinlik etkinliği olmamasıdır. StartActivityForResult'un çalışması için Sınıf B'nizin Etkinlik A'nın bir alt etkinliği olması gerekir ve bu tek bir örnek etkinlikte mümkün değildir, yeni Etkinlik (Sınıf B) yeni bir görevde başlar.


1
Sınıf B bir TabActivity ve Sınıf C bu aktivitede bir Sekme olduğundan, Sınıf B'de startActivityForResult yapamazsınız. Hiçbir aktivitem Tek Örnekli Etkinlik değildir.
Cameron McBride

-1

Etkinlik 2'yi Etkinlik 1'den başlatmak ve sonuç almak için, startActivityForResult'u kullanabilir ve Etkinlik 1'de onActivityResult'u uygulayabilir ve Etkinlik2'de setResult'u kullanabilirsiniz.

Intent intent = new Intent(this, Activity2.class);
intent.putExtra(NUMERO1, numero1);
intent.putExtra(NUMERO2, numero2);
//startActivity(intent);
startActivityForResult(intent, MI_REQUEST_CODE);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.