Android: Cómo usar onActivityResult desde el objeto de actividad?
Tengo una clase de ayuda que toma una actividad y realiza acciones con ella.
public class MyClass {
private AppCompatActivity activity;
private Callbacks callbacks;
public MyClass(AppCompatActivity activity, Callbacks callbacks) {
this.activity = activity;
this.callbacks = callbacks;
}
}
Lo que hago en esta clase básicamente es llamar a otras actividades o bibliotecas en un cierto orden y utilizar los resultados. Pongo esto en una clase de ayuda para poder reutilizar fácilmente el código.
Este es el problema que tengo:
Con el nuevo ActivityResultLauncher
, es fácil modularizar lo que necesito:
ActivityResultLauncher<intent> chooseImageLauncher = activity.registerForActivityResult(...);
…
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
chooseImageLauncher.launch(intent);
Y en la implementación de chooseImageLauncher
, hago lo que sea que necesite hacer a continuación. En este caso, llamaré a una biblioteca.
El problema es que la biblioteca a la que estoy llamando fue actualizada por última vez en 2020 y no proporciona un método para un ActivityResultLauncher
. Solo es compatible con la forma antigua utilizando onActivityResult
:
MyLibrary.init().start(activity);
Y el resultado se puede capturar de la siguiente manera:
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (requestCode == MyLibrary.REQUEST_CODE && resultCode == RESULT_OK) {
...
}
}
Pero solo puedo implementarlo en cada actividad en sí. ¿Cómo puedo implementarlo aquí?
davy.ai
Dado que la biblioteca que estás utilizando solo admite la forma antigua con
onActivityResult
, no puedes usar directamente el nuevoActivityResultLauncher
. Sin embargo, puedes crear una clase de ayuda separada que implementeActivityResultCallback
y utiliceonActivityResult
para manejar el resultado devuelto por la biblioteca.Aquí tienes un ejemplo de cómo puedes lograr esto:
ActivityResultCallback<activityresult>
:MyClass
, crea una nueva instancia deMyActivityResultCallback
y pasa el parámetrocallbacks
:startActivityForResult
, pasando tu actividad y la instancia deMyActivityResultCallback
:MyClass
, implementa la interfazCallbacks
y pasa una instancia en el constructor:Con esta solución, aún puedes modularizar tu código y reutilizarlo en varias actividades, al tiempo que manejas correctamente el resultado de la biblioteca utilizando el antiguo método
onActivityResult
.