Android Übergeordnete Activity herausfinden?

kurztipp

Aktives Mitglied
Hallo,

wie finde ich die aufrufende/übergeordnete Activity einer Activity heraus? getCallingActivity() liefert null, da ich nicht startActivityForResult() verwende.
Hintergrund: Durch ein ActionBarItem wird eine Activity gestartet, in der Daten eingegeben und gespeichert werden können. Kommt der Benutzer versehentlich auf die Zurücktaste werden die Eingaben verworfen. Ich möchte dann auf der Activity, auf die er zurück kommt einen Toast anzeigen, der die Möglichkeit gibt, zur Eingabe-Activity zurückzukehren, die dann die vorherig gemachten Eingaben wiederherstellt.

Hierzu müsste ich onBackPressed überschreiben und der übergeordneten Activity ein Intent mit einem Bundle übergeben (das die Eingaben enthält und wieder an die Eingabe-Activity zurückgegeben werden kann). Allerdings weiß ich nicht, wie ich an die übergeordnete Activity komme.
 

dzim

Top Contributor
Ich versuche immer - wo möglich - Activities zu vermeiden, weil ich dann mitunter vor haargenau dem Selben Problem stehen würde :-D
Grundsätzlich aber würde ich den weg eines Zentralen Models versuchen zu verfolgen, bei dem du vielleicht solche Daten - die ja nicht unbedingt gespeichert werden müssen und nur zu Laufzeit interessant sind - hinterlegst.

Aber auf StackOverflow ist man der Meinung, dass der Beste Weg immer noch #startActivityForResult() ist...

Sending data back to the Main Activity in android - Stack Overflow
 

kurztipp

Aktives Mitglied
Hallo,

arbeitest Du dann grundsätzlich mit Fragments statt Activities?

Bei einem zentralen Model müsste ich allerdings bei jedem Start der Activities (man kommt in die Editieractivity von mehreren Punkten) das Model auf Daten prüfen. Letztlich verrichtet die App dann häufig unnötige Arbeit.

Gruß
 

dzim

Top Contributor
Naja, ich habe schon auch noch Activities- irgendwo drauf müssen die Fragmente ja liegen. Aber das meiste sind Fragmente, ja (also auch die Dialoge, versteht sich).

Bei jeder UI musst du, wenn die angezeigt wird, evtl. prüfen, welche Daten angezeigt werden sollen.
"Zentrales Modell" kann auch einfach deine lokale DB darstellen.
Bedenke einfach: Deine Editier-Activity wird jedes mal neu geladen, also musst du sie auch wieder initialisieren. Bei Fragmenten kann das anders aussehen, solange sie nicht bereits durch das System zerstört wurden, sondern noch im Memory herumgeistern. Dann kann man evtl. sogar noch ihre Daten updaten und in der onResume evtl. nur noch mal setzen lassen (wenn du verstehst, was ich meine).

(Bin etwas krank heute und nicht ganz auf der geistigen Höhe.)
 

kurztipp

Aktives Mitglied
Hallo,

ganz um activities kommt man nicht herum, das ist mir bewusst ;) Mich würde dann nur der Ansatz interessieren. Denn eigentlich habe ich das so verstanden, dass Activities "eine logische Anzeigeeinheit" bilden. Daher habe eine Activity, welche die Daten (in einem Übersichts- und einem Detailfragment) anzeigt und eine Activity, in der die Daten eingegeben oder editiert werden können. Getrennt, da beide unterschiedliche Aufgaben erledigen.

Prinzipiell ist plane ich, dass die Editier-Activity von unterschiedlichen Activities gestartet werden kann. Daher würde ich eben gerne wissen, welche die Acitivity gestartet hat, um nicht in jeder auf Daten prüfen zu müssen. Um das zu vermeiden habe ich folgendes probiert:

Ich überschreibe onBackPressed() und starte darin einen Toast. Dieser Toast startet die Editieractivity mit einem Intent, das als IntentExtras die vormals eingegebenen Daten enthält, wenn auf den Toast gedrückt wird. Der Toast wird angezeigt, aber auf den click wird nicht reagiert.

Java:
    @Override
    public void onBackPressed() {
        LayoutInflater inflater = getLayoutInflater();
        View toastLayout = inflater.inflate(R.layout.toast_undo,
                                            (ViewGroup) findViewById(
                                                R.id.toast_layout_root));
        TextView toastUndoText = (TextView) toastLayout.findViewById(
            R.id.toast_undo_undo_text);
        toastUndoText.setClickable(true);
        toastUndoText.setPaintFlags(
            toastUndoText.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG);
        toastUndoText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Edit.this, Edit.class);
                intent.putExtra("someData", Edit.this.someDataEdit
                    .getText().toString());
                startActivity(intent);
            }
        });

        Toast toast = new Toast(this);
        toast.setView(toastLayout);
        toast.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, 0, 0);
        toast.setDuration(Toast.LENGTH_LONG);
        toast.show();
        super.onBackPressed();
    }

Bei Fragmenten kann das anders aussehen, solange sie nicht bereits durch das System zerstört wurden, sondern noch im Memory herumgeistern.
Gilt das nicht auch für Activities, sofern das System genügend speicher hat?

Gruß
 

dzim

Top Contributor
Stell dir Activities als immer-in-Vollbild angezeigte SWT-Shell oder JavaFX-Stage vor (weiss nicht, wie es in Swing heisst).
Fragmente sind dann nur in sich geschlossene Teile der UI. In SWT kannst du im Prinzip alle für eine bestimmte UI notwendigen Funktionen in eine von Composite abgeleitete Klasse machen. Der Unterschied ist nur, wie Pausen und Stops behandelt werden. Dichter an das Konzept heran kommt JavaFX mit seinen Controllern, die - wie auch Fragmente - grundsätzlich erst einmal nichts von einander wissen.

In deinem Fall verstehe ich noch nicht das onBackPressed zuüberschreiben um eine andere Activity zu starten (klingt für mich etwas unlogisch), aber ich hoffe mal, du hast dein Bedienkonzept überlegt ;-)

Was die Toast angeht und warum sie nicht auf den Klickreagieren kann ich dir nicht sagen. In der Form habe ich damit noch nicht gearbeitet. Gibt es vielleicht eine spezielle Variante aus der Support-Lib, dass du solche Klickbaren Toasts wie bei einigen Google-Apps bekommst?
 

kurztipp

Aktives Mitglied
In deinem Fall verstehe ich noch nicht das onBackPressed zuüberschreiben um eine andere Activity zu starten (klingt für mich etwas unlogisch), aber ich hoffe mal, du hast dein Bedienkonzept überlegt ;-)
Naja, onBackPressed wird ja nur überschrieben, um den Toast anzuzeigen. Danach wird super.onBackPressed() ausgeführt, in den Activity Backstack wird damit also nicht eingegriffen.
Lediglich ein click auf den Toast soll halt die eben geschlossene Activity wieder starten.

Was die Toast angeht und warum sie nicht auf den Klickreagieren kann ich dir nicht sagen. In der Form habe ich damit noch nicht gearbeitet. Gibt es vielleicht eine spezielle Variante aus der Support-Lib, dass du solche Klickbaren Toasts wie bei einigen Google-Apps bekommst?
API genau lesen, dann hätte ich mir den Versuch sparen können:
When the view is shown to the user, appears as a floating view over the application. It will never receive focus.
Dadurch, dass der Toast allerdings über der application angezeigt wird, kann ich ihn in der einen Activity starten, diese beenden und er wird in der anderen (oder eben auf dem Homescreen) angezeigt.

Bin allerdings eben auf PopupWindow gestoßen. Mal sehen, ob ich damit weiter komme. Aufgrund der API geh ich aber nicht davon aus:
The popup window is a floating container that appears on top of the current activity.
PopupWindow ist an die activity gebunden. Also wird es mit der super.onBackPressed() auch wieder verschwinden.
 

dzim

Top Contributor
Nutzt einen Context. Also zum Bsp. auch deineActivity.getApplicationContext() oder so. Sollte also quasi unabhänig von deiner konkreten Activity gehen, oder?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W JSONARRAY per Intent an andere Activity übergeben und umwandeln ggbf. Android & Cross-Platform Mobile Apps 1
M Activity einer anderen App mit result Android & Cross-Platform Mobile Apps 2
CT9288 Methode von Fragment durch Activity rufen scheitert Android & Cross-Platform Mobile Apps 7
ruutaiokwu Android Daten von "Activity A" nach "Activity B" umleiten? Android & Cross-Platform Mobile Apps 13
L Android Lockscreen-Sperrmuster activity verwenden Android & Cross-Platform Mobile Apps 1
J Android App stürzt ab wenn neue activity gestartet Android & Cross-Platform Mobile Apps 6
D Android Activity wechseln per Button Android & Cross-Platform Mobile Apps 3
P Android Android-App Crash - Unable to start activity ComponentInfo Android & Cross-Platform Mobile Apps 2
S Neue Activity lässt sich nicht starten Android & Cross-Platform Mobile Apps 28
B Android Activity nach gedrückte Returntaste weiterlaufen lassen Android & Cross-Platform Mobile Apps 2
J Probleme mit ViewPager und Activity Android & Cross-Platform Mobile Apps 1
B Android In einem View der ersten Activity zweite anzeigen Android & Cross-Platform Mobile Apps 2
G Accelerometer ohne Activity Android & Cross-Platform Mobile Apps 8
J Android BroadcastHandler extends BroadcastReceiver; auf Activity zugreifen? Android & Cross-Platform Mobile Apps 5
W Android Designfrage / Layout / Activity / Fragments Android & Cross-Platform Mobile Apps 2
B Login Activity Android & Cross-Platform Mobile Apps 1
M Android Suche Activity/View Namen Android & Cross-Platform Mobile Apps 1
K Unbekannte Menge von Daten (Strings oder Ints) an Activity übergeben Android & Cross-Platform Mobile Apps 0
M Fehler ohne Sinn? java.lang.RuntimeException: Unable to start activity ComponentInfo Android & Cross-Platform Mobile Apps 11
S Android Eclipse erstellt keine main Activity Android & Cross-Platform Mobile Apps 4
B java.lang.RuntimeException: Unable to start activity ComponentInfo Android & Cross-Platform Mobile Apps 2
K Android Activity for result aus Dialog Android & Cross-Platform Mobile Apps 1
S Android "Weiches wechseln" zwischen Views in einer Activity Android & Cross-Platform Mobile Apps 3
D Android Activity mit mehreren Views "spliten" Android & Cross-Platform Mobile Apps 10
G Activity-Wechsel bitte ohne Notification Android & Cross-Platform Mobile Apps 6
G eine Methode einer anderen Activity aufrufen Android & Cross-Platform Mobile Apps 9
D Android Neue Activity im TabWidget laden Android & Cross-Platform Mobile Apps 8
S Android In Service überprüfen ob eine Activity gebunden ist? Android & Cross-Platform Mobile Apps 6
T Android Activity finished testen Android & Cross-Platform Mobile Apps 5
T Activity / Application fundamentals Android & Cross-Platform Mobile Apps 4
M Activity wechseln aus List View mit Android & Cross-Platform Mobile Apps 2
G extends Activity für Berechnungen? Android & Cross-Platform Mobile Apps 7
G Daten von einer Activity zur nächsten übergeben Android & Cross-Platform Mobile Apps 6
G selbes Menü auf jeder Activity Android & Cross-Platform Mobile Apps 4
C Activity ohne Aktion starten Android & Cross-Platform Mobile Apps 8
C Android Kommunikation zwischen Service und Activity Android & Cross-Platform Mobile Apps 8
Maxim6394 [ Android ] Activity ändern Android & Cross-Platform Mobile Apps 9
A Activity Intent 'source not found' Android & Cross-Platform Mobile Apps 4
A Android Activity Variablen-Initialisierung Android & Cross-Platform Mobile Apps 8
A Beenden einer 2ten Activity Android & Cross-Platform Mobile Apps 3
W Standard Gallery Activity? Android & Cross-Platform Mobile Apps 22
schlingel Android: Overlay in Activity Android & Cross-Platform Mobile Apps 3
G Activity beenden Android & Cross-Platform Mobile Apps 2
J Firebase Bild URL herausfinden Android & Cross-Platform Mobile Apps 0
P Herausfinden, welches Fragment gerade angezeigt wird. Android & Cross-Platform Mobile Apps 1
M File der externen SD-Karte herausfinden Android & Cross-Platform Mobile Apps 3

Ähnliche Java Themen

Neue Themen


Oben