StartActivityForResult kullanıldığında, alt etkinlikte requestCode nasıl alınır?


88

A, B, C ve D gibi dört aktivitem var. Durumum A, startActivityForResult ile B aktivitesini başlatacak.

startActivityForResult(new Intent(this,B.class),ONE);

Diğer durumda, diğer durumla B yapacağım. sevmek

 startActivityForResult(new Intent(this,B.class),TWO);

B'de, requestCode'a bağlı olarak C veya D'yi aramam gerekir. Yani
, BİRİNİN C başka D'yi başlatması gerekiyorsa, çocuk Activity'deki (B burada) requestCode'u nasıl kontrol edeceğimi bilmem gerekiyor.
Başka bir deyişle, Aktivite B'nin başlatıldığı istek kodunu almak istiyorum.

Yanıtlar:


140

Ekstra koyarak istek kodunu geçebilirsiniz.

intent.putExtra("requestCode", requestCode);   

Eğer kullandıysanız Veya startActivityForResulther düzenleme daha iyi o zaman birçok kez, şunları yapabilirsiniz Gözlerinde farklı , böyle size kodu vardır eklemek overridestartActivityForResultActivity

@Override
    public void startActivityForResult(Intent intent, int requestCode) {
        intent.putExtra("requestCode", requestCode);
        super.startActivityForResult(intent, requestCode);
    }

Yani tüm startActivityForResult'unuzu düzenlemenize gerek yok, umarım
size yardımcı oldu


51
Bir çocuk etkinliğinin istek kodunu almasının gerçekten bir yolu yok mu?
i_am_jorf

1
Şimdiye kadar en iyi bilgime göre, başka yolu düşünmüyorum.
Labeeb Panampullan

17
Aynı şeyi merak ediyordum - bu, Android API'lerinde mantıklı olmayan şeylerden biri.
Artem Russakovskii

9
startActivityForResult, diğer uygulamalardaki etkinlikleri başlatmak için kullanılabilir, requestCode uygulamanızın özel konusudur. Bu açıdan bakıldığında, niyetin böyle bir yöntemi olmadığı mantıklıdır ve doğru yaklaşım, setAction'ın Aktivitenin tam olarak ne yapmasını istediğinizi önermesidir.
Maciej Beimcik

28

İstek kodu, başlatılan etkinliğe otomatik olarak iletilmez çünkü bu değeri bilmesi gerekmez (ve olmamalıdır). Nereden başladığını değil, sadece ne yapacağını bilmesi gerekir.

Bir aktivite başlatmak, aslında bir yöntemi çağırmanın başka bir şeklidir. Bir yöntemi aradığınızda, sonucu eşzamanlı olarak alırsınız (tam burada aramayı yaptığınız yerde). Bu durumda, yalnızca yöntemin işini yapması için ihtiyaç duyduğu bilgileri aktarırsınız. Onu nereden çağırdığını söylemiyorsun.

Etkinlik başlatmak, bir yöntemi çağırmanın zaman uyumsuz analoğudur, bu durumda sonucu özel onActivityResult () yönteminde alırsınız. Bu yöntemde, yeni aldığınız sonuçla ne yapacağınızı bilmeniz ve bunun için talep koduna sahip olmanız gerekir.

İstek kodunu bir parametre olarak iletmenin neden iyi bir fikir olmadığını biraz daha netleştirmek için, satın alabileceğiniz bir ürünü gösteren örnek etkinliği düşünün. Bu aktivitede "Satın Al" ve "Giriş Yap" etiketli iki düğme vardır (şu anda giriş yapmadığınız için). "Oturum Aç" düğmesine basmak, sağlanan bilgileri kullanarak kullanıcı oturum açmaya çalışacak "Oturum Aç" adlı bir etkinlik başlatacaktır. "Satın Al" a basmak ilk olarak aynı "Giriş" etkinliğini ve giriş başarılı olduysa satın alma etkinliğini başlatır.

Şimdi, "Oturum Aç" düğmesi, oturum açma etkinliğini başlatmak için istek kodu 1'i kullanır, ancak "Satın Al" düğmesi, oturum açma başarılı olursa farklı bir şey yapması gerekeceğinden aynı istek kodunu kullanamaz. Bu nedenle, "Satın al" düğmesi istek kodu 2'yi kullanır.

"Oturum Açma" etkinliğinde, nereden çağrıldığına bağlı olarak iki farklı istek kodu alabilirsiniz, ancak aynı prosedürü uygulamanız gerekecektir.

Dolayısıyla, istek kodunu bir parametre olarak iletirseniz, birkaç farklı istek kodu için aynı şeyleri yapması gereken bir kod elde edersiniz, örneğin:

if (requestCode == LOGIN || requestCode == BUY) {
    // ...
} else ...

Ayrıca, istek kodu sabitlerini merkezi bir konumda, örneğin RequestCodes adlı bir sınıfta depolamakla da sonuçlanacaksınız.

Kısacası, istek kodu yalnızca alınan sonuçla ne yapılacağına karar vermek için kullanılmalıdır. Bu şekilde, daha modüler, bakımı daha kolay ve genişletmesi daha kolay bir kod elde edersiniz.


1
Ya bu türden bir "yönetici" ise ve belirli bir değeri (ekstralarda kaydedilen değer) "kaydetmek" için bir istek kodunun gelmesini istiyorsanız. Bir değeri "geri alacak" (ve ekstra olarak geri dönen) başka bir istek kodu, ancak bu etkinlik içinde yeniden adlandırma, düzenleme, silme vb. Gibi kayıtlı değerleri genel olarak yönetebilirler. Böyle bir şey hakkındaki düşünceleriniz nelerdir? Aynı eylemleri yapmak için kodun / etkinliklerin çoğaltılmasını engelleyeceğini düşünüyorum.
JRomero

@ J.Romero Bunu yapma, sadece işleri karmaşıklaştırır. Bu işlevselliği bir (yardımcı program / tekli) sınıfına koyun. Ayrıca bakmak isteyebilirsiniz Handler ve Hizmet
Szabolcs Berecz

3
Szabolcs Çocuk etkinliği, "bu değeri bilmesi gerekmese bile" değeri bir zincirdeki bir sonraki etkinliğe iletmek zorunda kalabilir. İronik olarak, bunun için daha fazla kod yazmamız gerekiyor. Ne yapmamamız gerektiğini okumak için daha fazla ders aldıkça bilmemize gerek olmayan bir şey için.
user250343

Bunun, bir çocuk etkinliğinin istek koduna erişiminin neden reddedilmesi gerektiğini nasıl gösterdiğini anlamıyorum. Şimdi satın al ve oturum açma aramalarının yine de iki ayrı etkinlik olduğunu göz önünde bulundurarak, özel örneğinizde istek koduna erişmenin neden gerekli olduğundan emin değilim.
Drazen Bjelovuk

1
@EvanR. belki daha iyi bir mimari, "ana" öğe etkinliğini ayrı ekleme / düzenleme etkinliklerine alt sınıflandırmak olabilir. Dolayısıyla, kodun yeniden kullanımı minimumdur, ancak her etkinlik bağımsız olarak başlatılabilir.
Dane Powell

11

Bu tür bilgileri başlatma Etkinliğine geçirmek için özel Amaç eylemi kullanmayı bıraktım.

protected static final String ACTION_DO_C = "do_c";
protected static final String ACTION_DO_D = "do_d";

Sonra şöyle yaparsın:

final Intent intent = new Intent(this,B.class)
intent.setAction(ACTION_DO_C);
startActivityForResult(intent,ONE);

Aktivite'de Beylemi kolayca alırsınız:

getIntent().getAction();

bir cazibe gibi çalışıyor, gerçekten en iyi cevap. Teşekkürler.
YvesLeBorg

0

Mevcut etkinliği başlatan ve sonunda yanıt koduyla sonuç değerini alacak olan etkinliği almak için getCallingActivity () öğesini kullanabilirsiniz.

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.