Come passare i valori da un'attività all'attività precedente


97

Come si passa un valore da una schermata alla schermata precedente?

Considera questo caso: ho due attività. La prima schermata ha uno TextViewe un pulsante e la seconda attività ha uno EditTexte un pulsante.

Se faccio clic sul primo pulsante, deve passare alla seconda attività e qui l'utente deve digitare qualcosa nella casella di testo. Se preme il pulsante dalla seconda schermata, i valori dalla casella di testo dovrebbero spostarsi alla prima attività e questa dovrebbe essere visualizzata nella prima attività TextView.


Possibile duplicato
dell'invio

Risposte:


241

Per acquisire le azioni eseguite su un'attività all'interno di un'altra sono necessari tre passaggi.

Avvia l'attività secondaria (la tua attività "Modifica testo") come attività secondaria utilizzando startActivityForResultdalla tua attività principale.

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

All'interno della sottoattività, invece di chiudere semplicemente l'attività quando un utente fa clic sul pulsante, è necessario creare un nuovo intento e includere il valore del testo inserito nel suo pacchetto extra. Per passare di nuovo alla chiamata del genitore setResultprima di chiamare finishper chiudere l'attività secondaria.

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

Il passaggio finale è nell'attività di chiamata: sovrascrivi onActivityResultper ascoltare le richiamate dall'attività di immissione di testo. Ottieni l'extra dall'intento restituito per ottenere il valore di testo che dovresti visualizzare.

@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; 
    } 
  } 
} 

27
Tutto questo ha funzionato per me tranne che new Intent(null);era "troppo ambiguo" e ho dovuto cambiarlo in new Intent();.
Richard Tingle

1
Vale anche la pena notare che questo funzionerà solo nello stesso contesto. Ad esempio, se avvii l'attività da un frammento, non funzionerà perché requestCode sarà ogni volta diverso. Dovrai usare getActivity (). StartActivityForResult () nel frammento.
stef

10

Esistono due modi per accedere a variabili o oggetti in altre classi o attività.

A. Database

B. preferenze condivise.

C. Serializzazione degli oggetti.

D. Una classe che può contenere dati comuni può essere denominata Utilità comuni, dipende da te.

E. Passaggio di dati tramite Intents e Parcelable Interface.

Dipende dalle esigenze del tuo progetto.

A. Database

SQLite è un database open source incorporato in Android. SQLite supporta le funzionalità di database relazionali standard come la sintassi SQL, le transazioni e le istruzioni preparate.

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

B. Preferenze condivise

Supponi di voler memorizzare il nome utente. Quindi ora ci saranno due cose : nome utente chiave , valore valore.

Come conservare

 // 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();

Usando putString (), putBoolean (), putInt (), putFloat (), putLong () puoi salvare il dtatype desiderato.

Come recuperare

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

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

C. Serializzazione degli oggetti

La serlizzazione degli oggetti viene utilizzata se si desidera salvare lo stato di un oggetto per inviarlo in rete oppure è possibile utilizzarlo anche per il proprio scopo.

Usa java bean e memorizzalo come uno dei suoi campi e usa getter e setter per quello

I JavaBeans sono classi Java che hanno proprietà. Pensa alle proprietà come variabili di istanza private. Poiché sono privati, l'unico modo in cui è possibile accedervi dall'esterno della loro classe è tramite i metodi nella classe. I metodi che modificano il valore di una proprietà sono chiamati metodi setter, mentre i metodi che recuperano il valore di una proprietà sono chiamati metodi getter.

public class VariableStorage implements Serializable  {

    private String inString ;

    public String getInString() {
        return inString;
    }

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


}

Imposta la variabile nel tuo metodo di posta utilizzando

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

Quindi utilizza l'oggetto Serialzation per serializzare questo oggetto e nell'altra classe deserializza questo oggetto.

Nella serializzazione un oggetto può essere rappresentato come una sequenza di byte che include i dati dell'oggetto nonché le informazioni sul tipo di oggetto e sui tipi di dati memorizzati nell'oggetto.

Dopo che un oggetto serializzato è stato scritto in un file, può essere letto dal file e deserializzato, ovvero le informazioni sul tipo ei byte che rappresentano l'oggetto ei suoi dati possono essere utilizzati per ricreare l'oggetto in memoria.

Se vuoi un tutorial per questo, fai riferimento a questo link

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

Ottieni variabili in altre classi

D. CommonUtilities

Puoi creare una lezione da solo che può contenere dati comuni di cui hai spesso bisogno nel tuo progetto.

Campione

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

E. Passaggio di dati attraverso gli intenti

Fare riferimento a questo tutorial per questa opzione di passaggio dei dati.

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


6

non devi ...

Basta chiamare newIntent () dalla seconda attività

Intent retData=new Intent();

Aggiungi dati da restituire

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

Vai avanti con setResult

setResult(RESULT_OK, retData);

E può quindi finire

finish();


2

Uso spesso variabili statiche nell'attività di chiamata con metodi setter statici per impostarle.

In questo modo posso modificare i valori in qualsiasi attività a piacimento, indipendentemente dall'esatto flusso di controllo tra le varie attività.

Nota che questo trucco può essere utilizzato solo se non ti interessa la creazione di istanze di più di una copia della stessa attività (classe) nell'applicazione, tuttavia ho trovato che questo è il più facile da implementare e lo uso di più .


Non è un'ottima soluzione. Questo va contro le migliori pratiche di Android. Non puoi garantire che un'attività non verrà terminata e che una nuova istanza verrà avviata dal sistema.
SIr Codealot

0

Il modo migliore per farlo qui è mettere la variabile in una classe comune che è definita al di fuori dell'ambito

public class Utils 
{
    public static String mPosition;
}

all'interno del tuo codice (es. OnButtonClick ecc ...)

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);

all'interno del codice di

@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);
....
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.