Kaip valdyti startActivityForResult „Android“?

Savo veikloje startActivityForResult antruoju veiksmu iš startActivityForResult pagrindinio veiksmo. Antrajame veiksme yra keletas metodų, kurie užbaigia šią veiklą (galbūt be rezultato), tačiau tik vienas iš jų grąžina rezultatą.

Pavyzdžiui, iš pagrindinio veiksmo vadinu antrą. Šioje pratyboje, pavyzdžiui, patikrinu kai kurias telefono funkcijas, ji turi kamerą. Jei taip nebus, uždarysiu šį veiksmą. Be to, rengiant „ MediaRecorder arba „ MediaPlayer , jei įvyksta problema, uždarysiu šią operaciją.

Jei įrenginyje yra fotoaparatas ir įrašymas yra baigtas, tada įrašius vaizdo įrašą, jei vartotojas spustelės mygtuką „Baigti“, grąžinu rezultatą (įrašyto vaizdo adresą) atgal į pagrindinį veiksmą.

Kaip patikrinti pagrindinio veiksmo rezultatus?

831
02 мая '12 в 6:03 2012-05-02 06:03 Hesamas paklausė 02 gegužės 12 d. 6:03 2012-05-02 06:03
@ 9 atsakymai

Iš „ SecondActivity skambinkite „ SecondActivity with startActivityForResult()

Pavyzdžiui:

 Intent i = new Intent(this, SecondActivity.class); startActivityForResult(i, 1); 

SecondActivity nustatykite duomenis, kuriuos norite grįžti į „ FirstActivity . Jei nenorite grįžti, nediekite nieko.

Pavyzdžiui: „ SecondActivity jei norite siųsti atgal duomenis:

 Intent returnIntent = new Intent(); returnIntent.putExtra("result",result); setResult(Activity.RESULT_OK,returnIntent); finish(); 

Jei nenorite grąžinti duomenų:

 Intent returnIntent = new Intent(); setResult(Activity.RESULT_CANCELED, returnIntent); finish(); 

Dabar „ FirstActivity klasėje parašykite šį kodą onActivityResult() .

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1) { if(resultCode == Activity.RESULT_OK){ String result=data.getStringExtra("result"); } if (resultCode == Activity.RESULT_CANCELED) { //Write your code if there no result } } }//onActivityResult 
2168
02 мая '12 в 6:36 2012-05-02 06:36 atsakymas suteiktas Nishant 02 gegužės 12 d. 6:36 2012-05-02 06:36

Kaip patikrinti pagrindinio veiksmo rezultatus?

Turite panaikinti „ Activity.onActivityResult() , tada patikrinkite jo parametrus:

  • requestCode nustato, kuri programa grąžino šiuos rezultatus. Tai nustato jūs, kai skambinate startActivityForResult() .
  • resultCode nurodo, ar programa sėkminga, nepavyko, ar kažkas kita.
  • data saugo visą informaciją, kurią grąžina ši programa. Tai gali būti null .
44
02 мая '12 в 6:07 2012-05-02 06:07 atsakymas buvo duotas Sam 02 gegužės 12 d. 6:07 2012-05-02 06:07

Papildydamas @Nishant atsakymą, geriausias būdas grąžinti veiklos rezultatą:

 Intent returnIntent = getIntent(); returnIntent.putExtra("result",result); setResult(RESULT_OK,returnIntent); finish(); 

Turiu problemų

 new Intent(); 

Tada sužinojau, kad teisingas būdas yra naudoti

 getIntent(); 

gauti dabartinį ketinimą

34
26 мая '15 в 23:40 2015-05-26 23:40 Atsakymą pateikė Julian Alberto Piovesan Ruiz D , gegužės 26 d. 15 val. 23:40 2015-05-26 23:40

pavyzdys

Norėdami pamatyti visą procesą kontekste, čia yra papildomas atsakymas. Jei norite gauti išsamesnį paaiškinimą, žr. „ Mano išsamesnis atsakymas “.

2019

26
05 дек. Suragch atsakymas 05 Dec 2016-12-05 11:36 '16 at 11:36 2016-12-05 11:36

Jei norite atnaujinti naudotojo sąsają su veiklos rezultatais, negalite naudoti this.runOnUiThread(new Runnable() {} Tačiau vartotojo sąsaja nebus atnaujinta nauja verte. Vietoj to, galite tai padaryti:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_CANCELED) { return; } global_lat = data.getDoubleExtra("LATITUDE", 0); global_lng = data.getDoubleExtra("LONGITUDE", 0); new_latlng = true; } @Override protected void onResume() { super.onResume(); if(new_latlng) { PhysicalTagProperties.this.setLocation(global_lat, global_lng); new_latlng=false; } } 

Atrodo kvailas, bet jis veikia labai gerai.

10
08 марта '14 в 16:54 2014-03-08 16:54 atsakymą pateikė DaviF kovo 8 d. 14 d. 16:54 2014-03-08 16:54

Tiems, kurie turi problemų dėl neteisingo užklausos kodo onActivityResult

Jei iš Fragment skambinate startActivityForResult() , užklausos kodas keičiamas naudojant veiklą, kuriai priklauso fragmentas.

Jei norite gauti tinkamą rezultatą savo darbe, pabandykite atlikti šiuos veiksmus:

Redaguoti:

startActivityForResult(intent, 1); Į:

getActivity().startActivityForResult(intent, 1);

10
23 окт. Tomasz Mularczyk atsakymas pateikiamas spalio 23 d. 2015-10-23 15:58 '15, 15:58, 2015-10-23 15:58

Pirmiausia naudokite startActivityForResult() su parametrais pirmoje Activity , o jei norite siųsti duomenis iš antrosios Activity į pirmąją Activity , tada perduoti vertę naudodami „ Intent naudodami setResult() metodą, ir gaukite šiuos duomenis „ onActivityResult() pirmoje Activity .

2
30 сент. Atsakymas duotas Dharmendra Pratap 30 rugsėjis. 2014-09-30 15:30 '14, 15:30, 2014-09-30 15:30

Labai dažna problema „Android“
Jis gali būti suskirstytas į 3 dalis.
1) pradėti B pratimą (įvyksta A užduotyje)
2) Nustatykite pageidaujamus duomenis (įvyksta B veiksme)
3) Gauti prašomus duomenis (įvyksta A etape)

1) veiklos B pradžia

 Intent i = new Intent(A.this, B.class); startActivity(i); 

2) Nustatykite prašomus duomenis

Šioje dalyje nuspręsite, ar norite siųsti duomenis atgal, ar ne, kai įvyksta tam tikras įvykis.
Pavyzdžiui: B veiksme yra EditText ir du mygtukai b1, b2.
Paspaudus mygtuką b1 duomenys siunčiami atgal į operaciją A
Paspaudus mygtuką b2, duomenys nesiunčiami.

Duomenų siuntimas

 b1......clickListener { Intent resultIntent = new Intent(); resultIntent.putExtra("Your_key","Your_value"); setResult(RES_CODE_A,resultIntent); finish(); } 

Neišsiunčia duomenų

 b2......clickListener { setResult(RES_CODE_B,new Intent()); finish(); } 

vartotojas nuspaudžia mygtuką „Atgal“
Pagal numatytuosius nustatymus rezultatas nustatomas atsakymo kodu Activity.RESULT_CANCEL

3) Gaukite rezultatą

Norėdami tai padaryti, panaikinkite onActivityResult metodą

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RES_CODE_A) { // b1 was clicked String x = data.getStringExtra("RES_CODE_A"); } else if(resultCode == RES_CODE_B){ // b2 was clicked } else{ // back button clicked } } 
0
22 дек. Atsakymą pateikė Rohit Singh gruodžio 22 d. 2017-12-22 12:54 '17 at 12:54 2017-12-22 12:54

Valdovas @ Nishant yra teisus. Mano atveju, „OnActivityResult“ niekada nebuvo iškviestas dėl „AndroidManifest“ nustatymų. Įsitikinkite, kad antrasis veiksmas (arba siuntėjas) nenustato šios eilutės „Android“ manifeste.

 <activity android:name=".SecondViewActivity" android:parentActivityName=".FirstActivity"/> 

Jei taip, ištrinkite „ android:parentActivityName=".FirstActivity"

-2
27 февр. Atsakymą pateikė Catluc 27 vasario mėn. 2018-02-27 15:26 '18 prie 15:26 201-02-27 15:26