es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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í?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Dado que la biblioteca que estás utilizando solo admite la forma antigua con onActivityResult, no puedes usar directamente el nuevo ActivityResultLauncher. Sin embargo, puedes crear una clase de ayuda separada que implemente ActivityResultCallback y utilice onActivityResult para manejar el resultado devuelto por la biblioteca.

    Aquí tienes un ejemplo de cómo puedes lograr esto:

    1. Crea una nueva clase que implemente ActivityResultCallback<activityresult>:
    public class MyActivityResultCallback implements ActivityResultCallback<activityresult> {
        private final Callbacks callbacks;
    
        public MyActivityResultCallback(Callbacks callbacks) {
            this.callbacks = callbacks;
        }
    
        @Override
        public void onActivityResult(ActivityResult result) {
            if (result.getResultCode() == AppCompatActivity.RESULT_OK) {
                // maneja el resultado aquí
                callbacks.doSomething(result.getData());
            }
        }
    }
    
    1. En el constructor de tu clase MyClass, crea una nueva instancia de MyActivityResultCallback y pasa el parámetro callbacks:
    public MyClass(AppCompatActivity activity, Callbacks callbacks) {
        this.activity = activity;
        this.callbacks = callbacks;
        this.resultCallback = new MyActivityResultCallback(callbacks);
    }
    
    1. Llama a la biblioteca utilizando el método antiguo startActivityForResult, pasando tu actividad y la instancia de MyActivityResultCallback:
    MyLibrary.init().startActivityForResult(activity, MyLibrary.REQUEST_CODE, null, resultCallback);
    
    1. En cada actividad que utilice MyClass, implementa la interfaz Callbacks y pasa una instancia en el constructor:
    public class MyActivity extends AppCompatActivity implements Callbacks {
        private MyClass myClass;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.my_activity_layout);
    
            myClass = new MyClass(this, this);
            myClass.doStuff();
        }
    
        @Override
        public void doSomething(Intent data) {
            // maneja el resultado aquí
        }
    }
    

    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.

Comments are closed.