Übergeben der Werte von einer Aktivität an die vorherige Aktivität

97

Wie übergebe ich einen Wert von einem Bildschirm zum vorherigen?

Betrachten Sie diesen Fall: Ich habe zwei Aktivitäten. Der erste Bildschirm hat eine TextViewund eine Schaltfläche und die zweite Aktivität hat eine EditTextund eine Schaltfläche.

Wenn ich auf die erste Schaltfläche klicke, muss sie zur zweiten Aktivität wechseln und hier muss der Benutzer etwas in das Textfeld eingeben. Wenn er auf dem zweiten Bildschirm die Taste drückt, sollten die Werte aus dem Textfeld zur ersten Aktivität verschoben und in der ersten Aktivität angezeigt werden TextView.

Kumar
quelle
Mögliches Duplikat des Zurücksendens von Daten an die
Hauptaktivität

Antworten:

240

Um Aktionen zu erfassen, die für eine Aktivität in einer anderen ausgeführt werden, sind drei Schritte erforderlich.

Starten Sie die sekundäre Aktivität (Ihre Aktivität "Text bearbeiten") als Unteraktivität, indem Sie sie startActivityForResultaus Ihrer Hauptaktivität verwenden.

Intent i = new Intent(this,TextEntryActivity.class);    
startActivityForResult(i, STATIC_INTEGER_VALUE);

Innerhalb der Unteraktivität müssen Sie nicht nur die Aktivität schließen, wenn ein Benutzer auf die Schaltfläche klickt, sondern eine neue Absicht erstellen und den eingegebenen Textwert in das Extras-Bundle aufnehmen. So geben Sie es vor dem Aufruf an den übergeordneten Anruf zurück setResult, finishum die sekundäre Aktivität zu schließen.

Intent resultIntent = new Intent();
resultIntent.putExtra(PUBLIC_STATIC_STRING_IDENTIFIER, enteredTextValue);
setResult(Activity.RESULT_OK, resultIntent);
finish();

Der letzte Schritt ist die aufrufende Aktivität: Überschreiben onActivityResult, um auf Rückrufe aus der Texteingabe Aktivität zu warten. Holen Sie sich das Extra aus der zurückgegebenen Absicht, um den Textwert zu erhalten, den Sie anzeigen sollten.

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) {     
  super.onActivityResult(requestCode, resultCode, data); 
  switch(requestCode) { 
    case (STATIC_INTEGER_VALUE) : { 
      if (resultCode == Activity.RESULT_OK) { 
      String newText = data.getStringExtra(PUBLIC_STATIC_STRING_IDENTIFIER);
      // TODO Update your TextView.
      } 
      break; 
    } 
  } 
} 
Reto Meier
quelle
27
Das alles funktionierte für mich, außer dass new Intent(null);es "zu zweideutig" war und ich es ändern musste new Intent();.
Richard Tingle
1
Es ist auch erwähnenswert, dass dies nur im selben Kontext funktioniert. Wenn Sie die Aktivität beispielsweise von einem Fragment aus starten, funktioniert sie nicht, da der requestCode jedes Mal anders ist. Sie müssen getActivity (). StartActivityForResult () im Fragment verwenden.
stef
10

Es gibt verschiedene Möglichkeiten, auf Variablen oder Objekte in anderen Klassen oder Aktivitäten zuzugreifen.

Eine Datenbank

B. gemeinsame Einstellungen.

C. Objektserialisierung.

D. Eine Klasse, die allgemeine Daten enthalten kann, kann als allgemeine Dienstprogramme bezeichnet werden, die von Ihnen abhängen.

E. Weitergabe von Daten über Absichten und Paketschnittstelle.

Dies hängt von Ihren Projektanforderungen ab.

A. Datenbank

SQLite ist eine Open Source-Datenbank, die in Android eingebettet ist. SQLite unterstützt standardmäßige relationale Datenbankfunktionen wie SQL-Syntax, Transaktionen und vorbereitete Anweisungen.

Tutorials - http://www.vogella.com/articles/AndroidSQLite/article.html

B. Gemeinsame Einstellungen

Angenommen, Sie möchten den Benutzernamen speichern. Es wird also jetzt zwei Dinge geben, einen Schlüsselbenutzernamen , Wert Wert.

Wie zu speichern

 // Create object of SharedPreferences.
 SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
 //now get Editor
 SharedPreferences.Editor editor = sharedPref.edit();
 //put your value
 editor.putString("userName", "stackoverlow");

 //commits your edits
 editor.commit();

Mit putString (), putBoolean (), putInt (), putFloat (), putLong () können Sie Ihren gewünschten Datentyp speichern.

Wie zu holen

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
String userName = sharedPref.getString("userName", "Not Available");

http://developer.android.com/reference/android/content/SharedPreferences.html

C. Objektserialisierung

Die Objektserlisierung wird verwendet, wenn wir einen Objektstatus speichern möchten, um ihn über das Netzwerk zu senden, oder wenn Sie ihn auch für Ihren Zweck verwenden können.

Verwenden Sie Java-Bohnen und speichern Sie sie als eines seiner Felder. Verwenden Sie dafür Getter und Setter

JavaBeans sind Java-Klassen mit Eigenschaften. Stellen Sie sich Eigenschaften als private Instanzvariablen vor. Da sie privat sind, können sie nur von außerhalb ihrer Klasse über Methoden in der Klasse aufgerufen werden. Die Methoden, die den Wert einer Eigenschaft ändern, werden als Setter-Methoden bezeichnet, und die Methoden, die den Wert einer Eigenschaft abrufen, werden als Getter-Methoden bezeichnet.

public class VariableStorage implements Serializable  {

    private String inString ;

    public String getInString() {
        return inString;
    }

    public void setInString(String inString) {
        this.inString = inString;
    }


}

Legen Sie die Variable in Ihrer Mail-Methode mit fest

VariableStorage variableStorage = new VariableStorage();
variableStorage.setInString(inString);

Verwenden Sie dann das Objekt Serialzation, um dieses Objekt zu serialisieren und in Ihrer anderen Klasse dieses Objekt zu deserialisieren.

Bei der Serialisierung kann ein Objekt als eine Folge von Bytes dargestellt werden, die die Daten des Objekts sowie Informationen über den Objekttyp und die im Objekt gespeicherten Datentypen enthält.

Nachdem ein serialisiertes Objekt in eine Datei geschrieben wurde, kann es aus der Datei gelesen und deserialisiert werden, dh die Typinformationen und Bytes, die das Objekt und seine Daten darstellen, können verwendet werden, um das Objekt im Speicher neu zu erstellen.

Wenn Sie ein Tutorial dazu wünschen, klicken Sie auf diesen Link

http://javawithswaranga.blogspot.in/2011/08/serialization-in-java.html

Variable in anderen Klassen abrufen

D. CommonUtilities

Sie können selbst eine Klasse erstellen, die allgemeine Daten enthalten kann, die Sie häufig in Ihrem Projekt benötigen.

Stichprobe

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

E. Weitergabe von Daten durch Absichten

In diesem Tutorial finden Sie Informationen zum Übergeben von Daten.

http://shri.blog.kraya.co.uk/2010/04/26/android-parcel-data-to-pass-between-activities-using-parcelable-classes/

Nikhil Agrawal
quelle
6

du musst nicht ...

Rufen Sie einfach newIntent () aus der zweiten Aktivität auf

Intent retData=new Intent();

Fügen Sie Daten hinzu, die zurückgegeben werden sollen

putExtras (retData.putExtra("userName", getUsrName()));

Fahren Sie mit setResult fort

setResult(RESULT_OK, retData);

Und kann dann fertig werden

finish();
Sora
quelle
2

Ich benutze oft statische Variablen in der aufrufenden Aktivität mit statischen Setter-Methoden, um sie zu setzen.

Auf diese Weise kann ich Werte in jeder Aktivität nach Belieben ändern, unabhängig vom genauen Kontrollfluss zwischen den verschiedenen Aktivitäten.

Beachten Sie, dass dieser Trick nur verwendet werden kann, wenn Sie sich nicht für die Instanziierung von mehr als einer Kopie derselben Aktivität (Klasse) in der Anwendung interessieren. Ich fand dies jedoch am einfachsten zu implementieren und verwende ihn am häufigsten .

Ohad Aloni
quelle
Keine gute Lösung. Dies widerspricht der Best Practice von Android. Sie können nicht garantieren, dass eine Aktivität nicht beendet und eine neue Instanz vom System gestartet wird.
SIr Codealot
0

Der beste Weg, dies hier zu tun, besteht darin, eine Variable einer gemeinsamen Klasse zuzuordnen, die außerhalb des Gültigkeitsbereichs definiert ist

public class Utils 
{
    public static String mPosition;
}

in Ihrem Code (zB OnButtonClick etc ...)

Intent intent = new Intent(Intent.ACTION_PICK, 
ContactsContract.Contacts.CONTENT_URI);
Utils.mPosition = mViewData.mPosition + "";
LogHelper.e(TAG, "before intent: " + Utils.mPosition);
startActivityForResult(intent, Keys.PICK_CONTACT);

innerhalb des Codes von

@Override public void onActivityResult (int requestCode, int resultCode, Intent data) {if (requestCode == Keys.PICK_CONTACT) {if (resultCode == Activity.RESULT_OK) {Uri contactData = data.getData ();

            //you may use the variable here after intent result
            LogHelper.e(TAG, "after intent: " + Utils.mPosition);
....
Alp Altunel
quelle