Sé que esta pregunta se hizo antes, pero probé todas las soluciones y obtuve un error

Tengo dos actividades en Android Studio ...

El primero llamado 'MainActivity' y contiene un método 'delete FromArrayList ()' el segundo llamado 'DeletButtonActivity' y contiene un método 'delete (View v)'

Quiero invocar 'delete From ArrayList ()' sin crear otra clase o hacer que el método sea estático ... porque tengo una ArrayList dentro de deleteFromArrayList ()

Nota: envío el valor del índice que quiero eliminar de la lista de matrices usando Intent ... el código en DeleteButtonActivity es public void delete (Ver v) {

    try {

        Intent i = new Intent(DeleteButton.this, MainActivity.class);
        i.putExtra("index", (int) spinner2.getSelectedItemId());

        (new MainActivity()).DeletButtonActivity();

        Toast.makeText(getApplicationContext(), "it was deleted", Toast.LENGTH_SHORT).show();



    }
    catch(Exception e){
        Toast.makeText(getApplicationContext(), e+"", Toast.LENGTH_SHORT).show();


    }


}

Y el código en MainActivity

  public void deleteFromArrayList (){

    this.arrayList.remove(getIntent().getIntExtra("index",-1));

 }

Cuando ejecuto la aplicación, obtengo un error NullPointerException, ¿alguien puede ayudarme? Espero que describa muy bien el problema.

1
Rand 21 ago. 2016 a las 00:14

2 respuestas

La mejor respuesta

Las actividades en Android no son solo una clase simple, sino que también tienen un Ciclo de vida :

Una actividad tiene esencialmente cuatro estados:

Si una actividad está en primer plano de la pantalla (en la parte superior de la pila), está activa o en ejecución. Si una actividad ha perdido el foco pero aún es visible (es decir, una nueva actividad transparente o que no es de tamaño completo tiene el foco encima de su actividad), se detiene.

Una actividad pausada está completamente viva (mantiene toda la información de estado y miembros y permanece adjunta al administrador de ventanas), pero el sistema puede eliminarla en situaciones de memoria extremadamente baja.

Si una actividad está completamente oculta por otra actividad, se detiene. Aún conserva toda la información de estado y miembros, sin embargo, ya no es visible para el usuario, por lo que su ventana está oculta y, a menudo, el sistema la eliminará cuando se necesite memoria en otro lugar.

Si una actividad se pone en pausa o se detiene, el sistema puede eliminar la actividad de la memoria pidiéndole que finalice o simplemente matando su proceso. Cuando se muestre nuevamente al usuario, debe reiniciarse completamente y restaurarse a su estado anterior.

Entonces, el problema con su código es que cuando desea acceder a la matriz en una actividad detenida, la instancia que ha estado usando antes puede que ya no esté viva .

Cómo solucionar su problema

Un enfoque muy simple es usar paso de parámetros antes de hacer la transición de una actividad a otra, para esto, pasaría su matriz como un intent extra y luego" recuperas el resultado "cuando termines la segunda actividad usando devolución de llamada onActivityResult ().

Un segundo enfoque podría ser utilizar un Servicio que sea similar a una actividad, pero no tiene interfaz de usuario y tiene su propio ciclo de vida. Poder estar vivo incluso cuando tu aplicación no lo está. Al usar un Servicio, mantendrá la matriz dentro del servicio y comunicarse con la matriz para realizar las operaciones habituales.

Un tercer enfoque podría ser utilizar un EventBus. Un mecanismo de comunicación muy simple entre Actividades, Fragmentos, Hilos, Servicios. Hay una gran charla titulada Arquitectura de aplicaciones de Android en Android Dev Summit 2015 que utiliza EventBus como mecanismo de comunicación e implementar un patrón de arquitectura MVC en una aplicación REST para Android.

De vuelta a tu pregunta. Si solo necesita 'compartir' una matriz entre dos actividades, use el primer enfoque. El segundo y el tercero son solo ejemplos de diferentes alternativas para el caso de que necesite mucho más que eso.

0
Community 23 may. 2017 a las 12:23

No debes hacer esto. Existen mecanismos para comunicarse entre actividades o fragmentos.

Activado puede ser, usando startActivityForResult, esta es la Actividad A llama a la Actividad B, luego en B haces algo y comunicas el resultado a la Actividad A.

Puede tener otra solución alternativa a lo que desee. Si puede acceder a los datos en ambas actividades, puede modificar en una de ellas, cuando la actividad comience, mostrará los datos actualizados.

Primero lea atentamente acerca de una actividad aquí, y también proporciona más contexto de tu pregunta.

0
Pedro Varela 20 ago. 2016 a las 21:23