¿Como enviar datos entre activities?

publicado por: Anonymous

Tengo un problema. Tengo 2 activities, la principal y una segunda pantalla. Quiero que la 2da pantalla le mande datos a la pantalla principal pero cuando inicio la aplicación me dice que se detuvo y se cierra. Cuando lo hago al revés (De la página principal a la 2da pantalla) funciona sin problemas.

¿Alguien sabe porque el error? ¿Para pasar los datos estoy usando Bundle, es la forma correcta o hay una mejor?

Pantalla principal:

public class MainActivity extends AppCompatActivity {

TextView tv2;
Button b2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    tv2=(TextView)findViewById(R.id.tv2);
    b2=(Button)findViewById(R.id.b2); 

    Bundle parametros = this.getIntent().getExtras();
    String datos = parametros.getString("datos"); 
    tv2.setText(datos);
}

public void segunda_pantalla(View view){
    Intent i=new Intent(this, segunda_pantalla.class);
    startActivity(i);
}

Segunda Pantalla:

public class pantalla2 extends AppCompatActivity {

Button b1;
TextView tv1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_pantalla2);

    b1=(Button)findViewById(R.id.b1);
    tv1=(TextView)findViewById(R.id.tv1);
}

public void b1(View view){

    tv1.setText("1");

    String datos = tv1.getText().toString();

    Bundle parmetros = new Bundle();
    parmetros.putString("datos", datos);

    Intent i = new Intent(this, MainActivity.class);
    i.putExtras(parmetros);
    startActivity(i);
}

solución

Como enviar datos entre Activities.

Para realizar el envió de datos se realiza generalmente mediante un Bundle en el cual se pueden agregar valores y ese bundle se envía a través de un Intent. Se puede especificar el envió de cualquier tipo de elemento o array de elemento especificando el nombre:

    intent.putExtra("usuario", "StackOverflow!");
    intent.putExtra("id", 123);
    intent.putExtra("myByte", 0xa);
    intent.putExtra("latitud", 0.12324234);
    startActivity(intent);      

Los valores se obtienen en la Activity que recibe el Bundle mediante getExtras() o el método especifico para obtener tipo de dato recibido. Retorna null si no encuentra valor.

String valor = getIntent().getExtras().getString("usuario");

o simplemente:

String valor = getIntent().getStringExtra("usuario");

* Importante: es importante mencionar que la recepción de la información en la Activity destino debe realizarse siempre dentro del método onCreate() .


Tu problema sucede porque al iniciar MainActivity intenta recibir un bundle el cual tiene valor null, lo puedes verificar en el LogCat.

Caused by: java.lang.NullPointerException
at MainActivity.onCreate(MainActivity.java)

Realiza la siguiente validación:

 Bundle parametros = this.getIntent().getExtras();
 if(parametros !=null){
    String datos = parametros.getString("datos"); 
   tv2.setText(datos);
 } 

toma en cuenta que en la actividad que no asegures reciba un Bundle, tienes que realizar esta validación.

Además es importante comentar que para regresar a la primer Activity no necesitas realizarlo por medio de un Intent, simplemente usa finish() para cerrarla.


Para enviar datos entre activies se hace uso de la clase Bundle

Se puede usar el método putExtra() para adjuntar números enteros, valores de coma flotante, bytes, caracteres y algunos otros tipos de datos que se enumeran en la documentación oficial de desarrolladores de Android. Para recuperar estos valores del Intent en la Activity receptora, Servicio o Broadcast Receiver se usa el método getExtra().

Asi mismo, podemos almacenar cualquier número de pares clave-valor en un objeto Bundle y simplemente pasar este objeto a través del Intent:

Bundle extras = new Bundle();

extras.putString("USUARIO","jhon Doe"); // se obtiene el valor mediante getString(...)
extras.putInt("USUARIO_ID", 21); // se obtiene el valor mediante getInt(...)
extras.putBoolean("HABILITADO", true); // se obtiene el valor mediante getBoolean(...)

Intent intent = new Intent(this, NextActivity.class);
//Agrega el objeto bundle a el Intne
intent.putExtras(extras);
//Inicia Activity
startActivity(intent);

otros tipos que pueden ser enviados:

extras.putByte(key, Byte.parseByte(value)); // se obtiene el valor mediante getByte(...)
extras.putChar(key, value.charAt(0)); // se obtiene el valor mediante getChar(...)
extras.putDouble(key, Double.parseDouble(value)); // se obtiene el valor mediante getDouble(...)
extras.putFloat(key, Float.parseFloat(value)); // se obtiene el valor mediante getFloat(...)
extras.putLong(key, Long.parseLong(value)); // se obtiene el valor mediante getLong(...)
extras.putShort(key, Short.parseShort(value)); // se obtiene el valor mediante getShort(...)

Otras preguntas similares en el sitio que te serían de gran ayuda:

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *