Android Daten von "Activity A" nach "Activity B" umleiten?

ruutaiokwu

Top Contributor
Hallo zusammen

Im Internet (insbesondere bei StackOverflow) findet man dazu wieder mal lles mögliche - nur scheint davon irgendwie nix zu funktionieren.

Es geht um um einen Konfigurations-Screen (im Backend mit Kennwortschutz) mit 8 Textfeldern. Da dort lange und komplizierte Sachen reinmüssen, habe ich ein QR-Code-Bibliothek zu Hilfe genommen. Dann kann man die langen Werte auf irgendeiner QR-Code-Webseite eintragen und dann das QR-Code-Bild darauf generieren. Das kann man dann wiederum auf der Konfig-Seite (jedes Textfeld dort hat nen quadratischen Button auf der rechten Seite mit dem Text "QR" drauf)

Die Konfig-Seite heisst "SettingsActivity", die Seite wo der QR-Code-Reader aktiv wird (Bild der Kamera, welches erhalten bleibt bis ein QR-Code erkannt wird - anderenfalls kann man auch den (Hardware)-Back-Button der Android-Geräte verwenden falls man wieder zurück möchte - aus welchem Grund auch immer.

Die QR-Code-Erkennungs-Seite heisst "ScanActivity"...


Nun habe ich auf der Konfig-Seite für jeden "QR"-Code-Button-Klick es so gemacht, dass dabei die ID des neben dran liegenden Textfelds mit gegeben wird:


Code:
private static volatile TextView mCurrentFieldForQRCodeReader = null;

public TextView getCurrentFieldForQRCodeReader()
{
    return mCurrentFieldForQRCodeReader;
}

public void buttonQrAffiliateKey_click(final TextView caView)
{
    SettingsActivity.mCurrentFieldForQRCodeReader = caView;
    final Intent clIntent = new Intent(this.mActivity.getApplicationContext(), ScanActivity.setPreviousActivity(mActivity));
    this.startActivity(clIntent);
}

@Override
protected void onCreate(final Bundle savedInstanceState) {
findViewById(R.id.activitySettingsButtonQrAffiliateKey).setOnClickListener(caView -> buttonQrAffiliateKey_click(findViewById(R.id.activitySettingsTextFieldAffiliateKey)));
...
...
...
}

(Aber jetzt bitte nicht Sachen wie `ScanActivity.setPreviousActivity(mActivity)` thematisieren - da läuft nämlich auf das (u.A.) GENAU GLEICHE hinaus wie ScanActivity.class...)


In der "ScanActivity" geht's dann so:

Code:
private ScanCallback callback = new ScanCallback() {
    @Override
    public void onScanResult(String content) {
        final TextView clTextView = ((SettingsActivity)mPreviousActivity).getCurrentFieldForQRCodeReader();
        ScanActivityHandler.setTextFieldId(clTextView.getId());
        ScanActivityHandler.setTextFieldValue(content);
        final Intent clIntent = new Intent(mActivity.getApplicationContext(), SettingsActivity.setPreviousActivity(mActivity));
        mActivity.startActivity(clIntent);
    }
};

(Und nun sollte auch klar werden, für was `ScanActivity.setPreviousActivity(mActivity)` war... ;-))


ScanActivityHandler.java sieht aktuell so aus:

Code:
public abstract class ScanActivityHandler {

    private static volatile int mTextFieldId = 0;

    private static volatile String mTextFieldValue = null;

    private ScanActivityHandler()
    {
        super();
    }

    static
    {

    }

    public static int getTextFieldId()
    {
        return ScanActivityHandler.mTextFieldId;
    }

    public static String getTextFieldValue()
    {
        return ScanActivityHandler.mTextFieldValue;
    }

    public static void setTextFieldId(final int caTextField)
    {
        ScanActivityHandler.mTextFieldId = caTextField;
    }

    public static void setTextFieldValue(final String caTextFieldValue)
    {
        ScanActivityHandler.mTextFieldValue = caTextFieldValue;
    }
}


Und das wird dann auf der Konfig-Seite wieder ausgewertet:

Code:
@Override
protected void onCreate(final Bundle savedInstanceState) {

...
...
...

final String clTextFieldValue = ScanActivityHandler.getTextFieldValue();
    final int clTextFieldId = ScanActivityHandler.getTextFieldId();

    if(!(clTextFieldValue == null || clTextFieldValue.intern() == "" || clTextFieldId == 0))
    {
        // AndroidDialogProxy.showAlertDialog("test", "test", mActivity);
        ((TextView) findViewById(clTextFieldId)).setText(clTextFieldValue);
    }
}


Funktioniert soweit "wie am Schnürchen", ist aber nicht Android-Standard. (Zugegeben hasse ich solches Framework-Zeugs quasi "wie die Pest", ich interessiere mich eher für Algorithmen, also quasi Programmieren auf rein logisch-mathematischer Ebene. Also so Zeugs was direkt "vom Kopf in den Computer" reingeht, wenn ihr versteht was ich meine. ;-))


Also bei StackOverflow findet man dazu alles Mögliche:

- "Extras" hinzufügen über den "Intent" wenn man zurück will zur vorherigen Activity
- Diese "Extras" in der onCreate(...) ODER onActivityResult(...) abfangen. (WTF, was nun von beidem?!?)
- Bei der startActivity(...) zusätzlich einen int mitgeben, damit der in der onActivityResult(...) bei der Ziel-Activity abgefangen und demnach unterschieden werden kann. -> NIX GEHT: onActivityResult(...) wird überhauopt nie aufgerufen damit - ob nun mit oder ohne zusätzlichen int!!!

Das die onCreate(...) aufgerufen wird, ist eh klar. Deshalb meine Lösung des Problems.

Ich bin ehrlich gesagt nur noch verwirrt...!!

Meine "Lösung" ist wenigstens logisch nachvollziehbar, ganz im Ggs. zum Android-Kram.

Aber kann mir vielleicht doch noch jemand sagen, wie man es Android-Kram-konform macht...? ;-)
 
Zuletzt bearbeitet von einem Moderator:
"NIX GEHT DAMIT: onActivityResult(...) wird NIE aufgerufen damit!!! "

-> Frage mich wie das gehen sollte, die vorherrige Activity ist ja eh tot oder inaktiv oder "schlafend" oder was auch immer während dessen.
 
"Das was du da machst sieht zumindest komisch aus... "

Da wusste ich mir eben ausnahmsweise mal zu helfen. Aber wirklich seeeeeeehr ausnahmsweise!!
 
@admin: Bitte nun endlich den Package-Namen entfernen (!!!) oder gerade den ganzen Beitrag, habe schon eine Meldung zum Beitrag abgesendet welche aber leider unbeantwortet blieb.

-> Das nächte mal wird es ein eingeschriebener Brief sein!!
 
@jmar83 Also der Packagename wurde schon rauseditiert.

Ich meine du bittest um Hilfe und dann wird man angpöbelt, dass man etwas funktionierenden Code erfragt?
 
Hallo zusammen

Muss mich entschuldigen.

Beide Sachen sind im Prinzip mein Fehler:

- Das versehentliche copy/paste des Package-Namens!
-> Allerdings konnte ich den Beitrag nicht mehr selbst bearbeiten nach einer gewissen Zeit. Aber das wird wohl schon seine Gründe haben, warum dem so sei...(?)

- Meine Reklamation betr. nicht-Entfernung davon!
-> Habe einfach bei Google und Bing nach den entsprechenden Begriffen gesucht und diesen haben bei der URL https://www.java-forum.org/thema/daten-von-activity-a-nach-activity-b-umleiten.189052/#post-1229379 den indexierten Eintrag noch nicht aktualisiert. Und gleichzeitig wurde ich aber nicht darüber informiert (habe also keine Bestätigung erhalten) dass was entfernt wurde.


"Was soll diese plumpe Drohung??"

...tut mir leid, lieber Klaus, aber wenn du in sowas ne Drohung hineininterpretierst dann weiss ich auch nicht mehr weiter. (???) Ein eingeschriebener ist meines Erachtens dafür vorgesehen dass man eine WIRKLICHE Bestätigung hat dass die Mitteilung beim Empfänger angekommen ist resp. sich in den Händen von diesem befindet.


"Beiträge werden eigentlich generell nicht gelöscht!"

Nicht mal die eigenen, wenn ein Forenuser dies als notwendig erachtet? Dass Beiträge von anderen nur gelöscht werden wenn rechtlich gesehen ein stichhaltiger Grund dazu da ist, dann ist mir das absolut verständlich. Aber die eigenen...? Hmmm...??


Grüsse, Jan
 
"Ich meine du bittest um Hilfe und dann wird man angpöbelt, dass man etwas funktionierenden Code erfragt?"

Ich will hier gar niemanden anpöbeln... aber wenn ich den Foren-Admin-/Besitzer oder irgendwelche Moderatoren erfrage ob was von mir gelöscht werden kann, so erachte ich dies nicht als zuviel verlangt.

(Na ja, ich weiss: "C'est le ton qui fait la musique" ... ;-))
 
Ich weiß das geschriebene Sachen sehr leicht missinterpretiert werden können.

Ich glaub ich hab 2 mal deine Beiträge editiert und den meisten ist es egal, ob sie benachrichtigt werden oder nicht. Ich werde es in Zukunft auf "Benachrichtigen" umstellen.
 
Ich meinte es gibt eine Option beim Bearbeiten von Meldungen, wo der Benutzer informiert werden sollte. Ich werde das in Zukunft nutzen.
Bitte beim "Report" bleiben.
 
Eine kurze Benachrichtigung / Bestätigung ist immer gut!

An sowas wird heutzutage oft Zeit "gespart", aber später wird einem dann bewusst dass sich die paar vermeintlich eingesparten Sekunden eben doch nicht wirklich lohnen... ;-)
 

Zurück
Oben