Cómo pasar los valores de una actividad a la actividad anterior

97

¿Cómo paso un valor de una pantalla a su pantalla anterior?

Considere este caso: tengo dos actividades. La primera pantalla tiene uno TextViewy un botón y la segunda actividad tiene uno EditTexty un botón.

Si hago clic en el primer botón, debe pasar a la segunda actividad y aquí el usuario debe escribir algo en el cuadro de texto. Si presiona el botón de la segunda pantalla, los valores del cuadro de texto deben moverse a la primera actividad y eso debe mostrarse en la primera actividad TextView.

Kumar
fuente

Respuestas:

241

Para capturar las acciones realizadas en una Actividad dentro de otra se requieren tres pasos.

Inicie la actividad secundaria (su actividad 'Editar texto') como una subactividad utilizando startActivityForResultdesde su actividad principal.

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

Dentro de la subactividad, en lugar de simplemente cerrar la Actividad cuando un usuario hace clic en el botón, debe crear una nueva Intención e incluir el valor de texto ingresado en su paquete de extras. Para devolverlo a la llamada principal setResultantes de llamar finishpara cerrar la actividad secundaria.

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

El último paso es en la Actividad de llamada: Anular onActivityResultpara escuchar las devoluciones de llamada de la Actividad de entrada de texto. Obtenga el extra del Intent devuelto para obtener el valor de texto que debería mostrar.

@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
fuente
27
Todo esto funcionó para mí, excepto que new Intent(null);era "demasiado ambiguo" y tuve que cambiarlo a new Intent();.
Richard Tingle
1
También vale la pena señalar que esto solo funcionará dentro del mismo contexto. Si inicia la actividad desde un fragmento, por ejemplo, no funcionará porque el requestCode será diferente cada vez. Deberá usar getActivity (). StartActivityForResult () en el fragmento.
stef
10

Hay un par de formas en las que puede acceder a variables u objetos en otras clases o actividades.

A. Base de datos

B. preferencias compartidas.

C. Serialización de objetos.

D. Una clase que puede contener datos comunes puede denominarse Utilidades comunes, depende de usted.

E. Pasar datos a través de Intents e Interfaz Parcelable.

Depende de las necesidades de su proyecto.

A. Base de datos

SQLite es una base de datos de código abierto que está integrada en Android. SQLite admite funciones estándar de bases de datos relacionales como sintaxis SQL, transacciones y declaraciones preparadas.

Tutoriales: http://www.vogella.com/articles/AndroidSQLite/article.html

B. Preferencias compartidas

Suponga que desea almacenar el nombre de usuario. Así que ahora habrá dos cosas: Nombre de usuario clave , Valor Valor.

Cómo almacenar

 // 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 () puede guardar el tipo de datos que desee.

Cómo ir a buscar

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

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

C. Serialización de objetos

La serlización de objetos se usa si queremos guardar el estado de un objeto para enviarlo a través de la red o también puede usarlo para su propósito.

Use java beans y guárdelos como uno de sus campos y use getters y setter para eso

Los JavaBeans son clases de Java que tienen propiedades. Piense en las propiedades como variables de instancia privadas. Dado que son privados, la única forma en que se puede acceder a ellos desde fuera de su clase es a través de métodos en la clase. Los métodos que cambian el valor de una propiedad se denominan métodos setter y los métodos que recuperan el valor de una propiedad se denominan métodos getter.

public class VariableStorage implements Serializable  {

    private String inString ;

    public String getInString() {
        return inString;
    }

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


}

Configure la variable en su método de correo usando

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

Luego use Object Serialzation para serializar este objeto y en su otra clase deserialice este objeto.

En la serialización, un objeto se puede representar como una secuencia de bytes que incluye los datos del objeto, así como información sobre el tipo de objeto y los tipos de datos almacenados en el objeto.

Una vez que un objeto serializado se ha escrito en un archivo, se puede leer del archivo y deserializar, es decir, la información de tipo y los bytes que representan el objeto y sus datos se pueden usar para recrear el objeto en la memoria.

Si desea un tutorial para esto, consulte este enlace.

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

Obtener variable en otras clases

D. Servicios comunes

Puede crear una clase por sí mismo que puede contener datos comunes que necesita con frecuencia en su proyecto.

Muestra

public class CommonUtilities {

    public static String className = "CommonUtilities";

}

E. Pasar datos a través de Intents

Consulte este tutorial para conocer esta opción de transmisión de datos.

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

Nikhil Agrawal
fuente
6

no tienes que ...

Simplemente llame a newIntent () desde la segunda actividad

Intent retData=new Intent();

Agregar datos para devolver

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

Continúe con setResult

setResult(RESULT_OK, retData);

Y luego puede terminar

finish();
Sora
fuente
2

A menudo uso variables estáticas en la actividad de llamada con métodos de establecimiento estáticos para configurarlas.

De esta manera puedo cambiar los valores en cualquier actividad a voluntad, independientemente del flujo exacto de control entre las diversas actividades.

Tenga en cuenta que este truco solo se puede usar si no le importa la creación de instancias de más de una copia de la misma actividad (clase) en la aplicación, sin embargo, encontré que este es el más fácil de implementar y lo uso más .

Ohad Aloni
fuente
No es una gran solución. Esto va en contra de las mejores prácticas de Android. No puede garantizar que una actividad no se eliminará y que el sistema iniciará una nueva instancia.
SIr Codealot
0

La mejor manera de hacerlo aquí es poner la variable en una clase común que se define fuera del alcance

public class Utils 
{
    public static String mPosition;
}

dentro de su código (por ejemplo, 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);

dentro del código de

@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
fuente