Activity Rückgabewert

  • 20 Antworten
  • Neuester Beitrag
Diskutiere Activity Rückgabewert im Android App Entwicklung im Bereich Betriebssysteme & Apps.
J

joschika77

Fortgeschrittenes Mitglied
Hallo habe folgendes Problem. Ich habe eine Main-Activity die nach Buttonclick eine zweite Activity aufruft, was auch gut klappt.Nun geht es darum erstmal irgend einen Rückgabewert zu erhalten. Leider wird die überschriebene Methode aus der main-Activity nicht aufgerufen. Wüsste gern warum?

Aufruf vom Button aus der der 1. Activity:
Code:
Intent intentCatPos = new Intent(main.this,ECategoryPostingTypeActivity.class);
main.this.startActivityForResult(intentCatPos,Activity.RESULT_OK);
Überschriebene Methode in der 1. Activity:
Code:
    @Override
    protected void onActivityResult(int requestCode,int resultCode,Intent data) 
    {
        // See which child activity is calling us back.
        switch (resultCode) 
        {
           case Activity.RESULT_OK: Log.d(TAG, "Wieder zurück");         
           default:break;
        }
    }
onCreate der 2. Activity:
Code:
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.cat_pos_320x480_portrait);    

        s = (Spinner) findViewById(R.id.spinner);      
        ArrayAdapter<?> adapter = ArrayAdapter.createFromResource(
               this, R.array.planets, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        s.setAdapter(adapter);
        s.setOnItemSelectedListener(new OnItemSelectedListener()
        {

            public void onItemSelected(AdapterView<?> parent,View v,int position,long id) 
            {               ECategoryPostingTypeActivity.this.setResult(Activity.RESULT_OK,
                        ECategoryPostingTypeActivity.this.getIntent());
                    ECategoryPostingTypeActivity.this.finish();
            }

            public void onNothingSelected(AdapterView<?> arg0) 
            {
                //
            }
            
        });
    }
und zum schluss noch der activityteil aus der xml

Code:
        <activity android:name=".ECategoryPostingTypeActivity"
                  android:label="@string/sub_app_name_catpos">
            <intent-filter>
                <action android:name="android.intent.action.ECATEGORYPOSTINGTYPEACTIVITY" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
Was genau muß ich beim
Code:
setResult()
als 2. Parameter übergeben? Aber dazu muß er ja erstmal überhaupt in der Methode ankommen. Ich hoffe hier kann jemand helfen.

MfG
 
S

swordi

Lexikon
ich hatte damit auch mal probleme,

schau dir da mal an, was du in der onActivityResult
überhaupt für werte bekommst. evtl passt da etwas
nicht zusammen
 
J

joschika77

Fortgeschrittenes Mitglied
Na das ist ja erstmal das Hauptproblem. Diese Methode wird ja gar nicht aufgerufen. :confused:
 
S

swordi

Lexikon
aha sehr komisch

ich mach es so

Activity 1
startActivityForResult(x, 1);

onResult()
system.out.println(resultwerte);

Activity 2
setResult(1);
finish();

das funktioniert

warum nimmst du da immer
ECategoryPostingTypeActivity.this.xxx??? was hatn das für einen sinn
 
J

joschika77

Fortgeschrittenes Mitglied
Code:
ECategoryPostingTypeActivity.this.setResult(...)
ist das gleiche wie
Code:
setResult(...)
. In meinem Beispiel würde this.setResult nicht klappen weil sich im Listener das this auf den Listener halt bezieht. Also man kann es davor schreiben, muss man aber nicht. Also wie du es beschrieben hast hab ich es auch. Das gibt es doch nicht. :eek: Stimmt denn was mit der xml nicht?
 
S

swordi

Lexikon
bekommst du irgendwelche debug ausgaben, die auf ein problem hinweisen?
 
J

joschika77

Fortgeschrittenes Mitglied
leider nicht...ich debugge ja durch und in diese Methode geht er 100% nicht wieder rein...Im Log.Cat steht ja meine Ausgabe die ich da habe auch nicht. Am Spinner und dem clickitemselected liegt das ja hoffentlich auch nicht.
 
S

swordi

Lexikon
also er führt das finish() aus - geht zur activity zurück und alles funktioniert normal, nur das onActivityResult wird nicht aufgerufen?
 
J

joschika77

Fortgeschrittenes Mitglied
Ja genau so. Ich hab noch ein Verständnisproblem mit dieser Zeile
Code:
ECategoryPostingTypeActivity.this.setResult(Activity.RESULT_OK,
                        ECategoryPostingTypeActivity.this.getIntent());
Also vor dem finish(). Was übergebe ich als 2. Parameter?
 
J

joschika77

Fortgeschrittenes Mitglied
So hab das Intent mal weggelassen. Geht trotzdem nicht. Mist!

Code:
                    ECategoryPostingTypeActivity.this.setResult(Activity.RESULT_OK);
                    ECategoryPostingTypeActivity.this.finish();
Ich denke das Intent brauch ich um im 1. Activity auf Daten vom 2. Activity zuzugreifen.


Hier mal meine LogCat:
PHP:
07-02 13:18:23.376: INFO/main(1865): onPause
07-02 13:18:23.396: INFO/NotificationService(570): enqueueToast pkg=com.logbook callback=android.app.ITransientNotification$Stub$Proxy@43736d90 duration=0
07-02 13:18:27.716: INFO/main(1865): onStop
07-02 13:18:27.757: INFO/NotificationService(570): enqueueToast pkg=com.logbook callback=android.app.ITransientNotification$Stub$Proxy@43780ee0 duration=0
07-02 13:18:28.397: INFO/ActivityManager(570): Displayed activity com.logbook/.ECategoryPostingTypeActivity: 8769 ms
07-02 13:18:50.186: WARN/InputManagerService(570): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@43725c60
07-02 13:18:55.047: INFO/main(1865): onRestart
07-02 13:18:55.057: INFO/NotificationService(570): enqueueToast pkg=com.logbook callback=android.app.ITransientNotification$Stub$Proxy@43736350 duration=0
07-02 13:18:57.256: INFO/main(1865): onStart
07-02 13:18:57.268: INFO/NotificationService(570): enqueueToast pkg=com.logbook callback=android.app.ITransientNotification$Stub$Proxy@436ce760 duration=0
07-02 13:18:59.348: INFO/main(1865): onResume
07-02 13:18:59.357: INFO/NotificationService(570): enqueueToast pkg=com.logbook callback=android.app.ITransientNotification$Stub$Proxy@4373ace0 duration=0
07-02 13:19:00.017: WARN/ActivityManager(570): Launch timeout has expired, giving up wake lock!
07-02 13:19:00.326: WARN/ActivityManager(570): Activity idle timeout for HistoryRecord{4358b928 {com.logbook/com.logbook.main}}
07-02 13:19:48.656: WARN/jdwp(1865): Debugger is telling the VM to exit with code=1
07-02 13:19:48.656: INFO/dalvikvm(1865): GC lifetime allocation: 2315 bytes
07-02 13:19:48.768: INFO/ActivityManager(570): Process com.logbook (pid 1865) has died.
07-02 13:19:48.776: INFO/WindowManager(570): WIN DEATH: Window{436ba290 com.logbook/com.logbook.main paused=false}
07-02 13:19:48.956: DEBUG/Zygote(541): Process 1865 exited cleanly (1)
07-02 13:19:49.638: WARN/InputManagerService(570): Got RemoteException sending setActive(false) notification to pid 1865 uid 10018
 
S

swordi

Lexikon
naja
ganz klar dass da nichts mehr passiert

dein programm stirbt einfach

07-02 13:19:48.776: INFO/WindowManager(570): WIN DEATH: Window{436ba290 com.logbook/com.logbook.main paused=false}
07-02 13:19:48.956: DEBUG/Zygote(541): Process 1865 exited cleanly (1)

DEATH - TOT
 
J

joschika77

Fortgeschrittenes Mitglied
Wie? Deswegen wird auch die Restart aufgerufen was? Aber warum stirbt die Activity?
 
J

joschika77

Fortgeschrittenes Mitglied
Ne ne hab das nochmal gemacht gerade.Ist alles richtig. Hatte wohl zuviel vorhin kopiert. :)

PHP:
07-02 13:37:34.037: INFO/main(1961): onStart
07-02 13:37:34.387: INFO/NotificationService(570): enqueueToast pkg=com.logbook callback=android.app.ITransientNotification$Stub$Proxy@43777340 duration=0
07-02 13:37:37.650: INFO/main(1961): onResume
07-02 13:37:37.727: INFO/NotificationService(570): enqueueToast pkg=com.logbook callback=android.app.ITransientNotification$Stub$Proxy@436b3428 duration=0
07-02 13:37:41.297: INFO/ActivityManager(570): Displayed activity com.logbook/.main: 39430 ms
07-02 13:37:48.747: INFO/ActivityManager(570): Starting activity: Intent { comp={com.logbook/com.logbook.ECategoryPostingTypeActivity} }
07-02 13:37:49.358: WARN/ActivityManager(570): Activity pause timeout for HistoryRecord{4375a460 {com.logbook/com.logbook.main}}
07-02 13:37:53.837: INFO/main(1961): onPause
07-02 13:37:53.847: INFO/NotificationService(570): enqueueToast pkg=com.logbook callback=android.app.ITransientNotification$Stub$Proxy@43719f10 duration=0
07-02 13:37:57.689: INFO/main(1961): onStop
07-02 13:37:57.736: INFO/NotificationService(570): enqueueToast pkg=com.logbook callback=android.app.ITransientNotification$Stub$Proxy@4376e6b8 duration=0
07-02 13:37:58.857: WARN/ActivityManager(570): Launch timeout has expired, giving up wake lock!
07-02 13:37:59.267: INFO/ActivityManager(570): Displayed activity com.logbook/.ECategoryPostingTypeActivity: 10509 ms
07-02 13:38:19.378: WARN/ActivityManager(570): Activity pause timeout for HistoryRecord{43795d00 {com.logbook/com.logbook.ECategoryPostingTypeActivity}}
07-02 13:38:21.868: WARN/InputManagerService(570): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@43764720
07-02 13:38:28.961: WARN/ActivityManager(570): Launch timeout has expired, giving up wake lock!
07-02 13:38:29.207: INFO/main(1961): onRestart
07-02 13:38:29.227: INFO/NotificationService(570): enqueueToast pkg=com.logbook callback=android.app.ITransientNotification$Stub$Proxy@43711b30 duration=0
07-02 13:38:29.459: WARN/ActivityManager(570): Activity idle timeout for HistoryRecord{4375a460 {com.logbook/com.logbook.main}}
07-02 13:38:33.356: INFO/main(1961): onStart
07-02 13:38:33.376: INFO/NotificationService(570): enqueueToast pkg=com.logbook callback=android.app.ITransientNotification$Stub$Proxy@4372ac68 duration=0
07-02 13:38:34.531: WARN/ActivityManager(570): Activity destroy timeout for HistoryRecord{43795d00 {com.logbook/com.logbook.ECategoryPostingTypeActivity}}
07-02 13:38:37.277: INFO/main(1961): onResume
07-02 13:38:37.286: INFO/NotificationService(570): enqueueToast pkg=com.logbook callback=android.app.ITransientNotification$Stub$Proxy@436ea7c0 duration=0
 
S

swordi

Lexikon
also wenn deine app stirbt, dann wird sie neu gestartet - passiert glaub ich immer automatisch.

das ist auf jedenfall ein guter hinweis, dass da etwas tot ist.
 
J

joschika77

Fortgeschrittenes Mitglied
So jetzt hab ich Skynet bei den Eiern.:D Das Problem war der RequestCode. Da hatte ich
Code:
Activity.RESULT_OK
und das scheint nicht zu klappen. Hab mir einen eigenen gebaut und siehe da....ES GEHT!!! :cool:
 
S

swordi

Lexikon
deshalb hab ich auch immer setResult(1)

geschrieben ;)
 
zx128

zx128

Experte
Da ist vom Anfang an ein Denkfehler drin:

Code:
Intent intentCatPos = new Intent(main.this,ECategoryPostingTypeActivity.class);
main.this.startActivityForResult(intentCatPos,[B]Activity.RESULT_OK[/B]);
da gehört nicht der RESULT_CODE sondern REQUEST_CODE hin.
Es muss einfach eine Konstante sein (1, 23, was auch immer).

Der Sinn ist der, dass wenn du aus der ersten Activity mehrere Activities startest - muss du ja in onActivityResult unterscheiden können, welche gerade beendet wurde.

Daher macht man ein switch in onActivityResult auf requestCode, weiß somit welche Activity beendet wurde und erst dann guckt man sich das resultCode an.

Activity | Android Developers)


onActivityResult wird nicht angerufen, weil requestCode >= 0 sein muss
Activity | Android Developers)

und RESULT_OK = -1.

Soweit klar?
 
J

joschika77

Fortgeschrittenes Mitglied
Jap soweit so gut. Schön was vertauscht. Aber wie übertrage ich jetzt z.B. vom Spinner den ausgewählten String? Mit dem 2. Parameter, dem Intent?
 
zx128

zx128

Experte
joschika77 schrieb:
Jap soweit so gut. Schön was vertauscht. Aber wie übertrage ich jetzt z.B. vom Spinner den ausgewählten String? Mit dem 2. Parameter, dem Intent?
Hast da paar Möglichkeiten.

Wenn es nur ein String ist - kannst du tricksen und Intent(String action) nehmen.

Oder du kannst dir putExtra angucken und damit Sachen übergeben.
Intent | Android Developers)

Und vor allem Doku lesen, das spart sehr viel Zeit und Nerven ;)