studio setresult activity android android-activity onactivityresult

android - setresult - startactivityforresult fragment



Cómo usar el método onActivityResult de otra clase que no sea Activity (7)

Estoy creando una aplicación donde necesito encontrar la ubicación actual del usuario.

Así que aquí me gustaría hacer una tarea como cuando el usuario regresa de esa intención del sistema, mi tarea debería hacerse después de eso (Mostrar la ubicación actual de los usuarios)

Así que estoy planeando usar OnActivityResult() .

protected void onActivityResult(int requestCode, int resultCode, Intent data) { }

Pero el problema es que no sé cómo puedo usar ese método en una clase que no está extendiendo la Actividad.

Por favor, alguien me dé una idea de cómo puedo lograr esto?


Cree una clase interna en la clase que no sea de actividad y defina su controlador de resultados de actividad en ella:

class singletonActivity extends Activity{ protected void onActivityResult(...){ // do whatever .. } }

intuirlo para llamar a startActivityForResult

Activity actv = new singletonActivity(..) actv.startActivityForResult(intent ..)

Se llamará su controlador. :)

ps: es posible que tengas que incluir algunas anulaciones. sólo déjalos vacíos.

pps: este es el estilo de old school java mouseListenerAdapter ~ Oo>


Cuando inicia una actividad con el método startActivityForResult desde una actividad, solo la persona que llama recibirá el resultado.

Así que puedes manejar el resultado y pasarlo a la tarea o actualizar la interfaz de usuario de esa actividad:

int MY_REQUEST_ID = 1; public void onClick(){ //Select a contact. startActivityForResult( new Intent(Intent.ACTION_PICK, new Uri("content://contacts")), MY_REQUEST_ID); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCose == MY_REQUEST_ID && resultCode == SUCCESS) { MyAsyncTask task = new AsyncTask(requestCode, resultCode, data); task.execute(); // or update the UI textView.setText("Hi, activity result: "+ resultCode); } }


Finalmente obtuve lo que necesito y también la solución para esta pregunta.

Activity con; Intent intent_= new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); con.startActivityForResult(intent_, 0);

Ahora puedo crear un método aquí,

public void startActivityForResult(Intent i, int code) { Log.e("", "insede method startActivityForResult()"); }

Al utilizar este sistema, no se crea una subactividad para mi intención, por lo que este método se llama solo después de que el usuario vuelve de la intención.


Lo estoy usando así, esto puede ser útil para otros.

En mi fragmento tengo

// Upload Cover Photo On Button Click btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Start The Image Cropper And Go To onActivityResult Intent intent = ImageManager.startImageCropper(getContext()); startActivityForResult(intent, CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE); } });

Entonces llamando el resultado como este en el fragmento

// On Activity Result for Start Activity For Result @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // Get The Image From Image Cropper Uri resultUri = ImageManager.activityResult(requestCode, resultCode, data, getContext()); }

La clase pública / funciones que soportan estos son

public class ImageManager { // Start Image Cropper public static Intent startImageCropper(Context context) { // Crop Image Intent intent = CropImage.activity() .setGuidelines(CropImageView.Guidelines.ON) .setActivityTitle("Title") .setCropMenuCropButtonTitle("Save") .setAutoZoomEnabled(true) .setAspectRatio(1, 1) .getIntent(context); return intent; } public static Uri activityResult(int requestCode, int resultCode, Intent data, Context context) { // Handle Cropped Image Uri resultUri = null; if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) { CropImage.ActivityResult result = CropImage.getActivityResult(data); if (resultCode == Activity.RESULT_OK) { resultUri = result.getUri(); } else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) { Exception error = result.getError(); Toast.makeText(context, (CharSequence) error, Toast.LENGTH_SHORT).show(); } } return resultUri; } }


Necesitas una Actividad para recibir el resultado.

Si es solo para la organización del código, llame a otra clase de la clase Activty.

public class Result { public static void activityResult(int requestCode, int resultCode, Intent data){ ... } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Result.activityResult(requestCode,resultCode,data); ... }


OnActivityResult() registrar una Activity en esta clase y luego usar OnActivityResult() para esa actividad.


No puedes llamar a este método fuera de su alcance.

protected void onActivityResult (int requestCode, int resultCode, Intent data)

Si el método está protegido como este caso, puede ver la tabla de niveles de acceso para saber cómo proceder.

|-----------------------------------------------------------| | ACCESS LEVELS | |------------------|---------|---------|----------|---------| | Modifier | Class | Package | Subclass | World | |------------------|---------|---------|----------|---------| | public | Y | Y | Y | Y | |------------------|---------|---------|----------|---------| | protected | Y | Y | Y | N | |------------------|---------|---------|----------|---------| | no modifier | Y | Y | N | N | |------------------|---------|---------|----------|---------| | private | Y | N | N | N | |------------------|---------|---------|----------|---------|

Como puede ver, solo se puede llamar a este método desde el paquete android.app.* , La Activity y sus subclases.

SOLUCIÓN:

Necesitas hacer algo como esto:

Tenemos un ImagePicker clase para seleccionar una imagen de Galería o Cámara o Eliminarla . Esta clase debe invocar onActivityResult si el usuario desea eliminar una imagen (No necesitamos iniciar una Activity para obtener un resultado que ya conocemos).

public class ImagePicker { private ImagePickerDelegate delegate; public ImagePicker (ImagePickerDelegate delegate) { this.delegate = delegate; } //Will explain this two methods later public void show() { //Some code to show AlertDialog } public void handleResponse(Intent data) { //Some code to handle onActivityResult } //Our interface to delegate some behavior public interface ImagePickerDelegate { void onImageHandled(Bitmap image); void onImageError(); void onImageDeleted(); } }

Para utilizar esta clase en nuestra Activity , necesitamos implementar los métodos de delegado y pasar nuestra actividad como delegado de ImagePicker :

public class MyActivity extends Activity implements ImagePicker.ImagePickerDelegate { ImagePicker imagePicker; @OnClick(R.id.image_edit) public void selectImage () { imagePicker = new ImagePicker(this); imagePicker.show(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == ImagePicker.REQUEST_IMAGE_PICKER && resultCode == RESULT_OK) { imagePicker.handleResponse(data); } super.onActivityResult(requestCode, resultCode, data); } @Override public void onImageHandled(Bitmap image) { //handle image resized imageView.setImageBitmap(image); } @Override public void onImageError() { //handle image error Toast.makeText(this, "Whoops - unexpected error!", Toast.LENGTH_SHORT).show(); } @Override public void onImageDeleted() { //handle image deleted groupImageView.setImageBitmap(null); groupImageView.setImageResource(R.drawable.ic_pick_picture); } }

Finalmente, necesitamos hacer miles de métodos delegados para ser llamados, y eso sucede en show() y handleResponse(Intent data) :

//The show method create and dialog with 3 options, //the important thing here, is when an option is selected public void show() { //Inflating some views and creating dialog... NavigationView navView = (NavigationView)viewInflated.findViewById(R.id.navigation_menu); navView.setNavigationItemSelectedListener( new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { switch (menuItem.getItemId()) { case R.id.action_select_image: Intent pickPhoto = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); activity.startActivityForResult(pickPhoto , REQUEST_IMAGE_PICKER); break; case R.id.action_take_picture: Intent takePicture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); activity.startActivityForResult(takePicture, REQUEST_IMAGE_PICKER); break; case R.id.action_delete_image: delegate.onImageDeleted(); //send response to activity break; } alertDialog.dismiss(); return true; } }); //Show dialog... } //this method is called from onActivityResult public void handleResponse(Intent data) { try { //Retrieve and resize image... delegate.onImageHandled(image); //send the image to activity } catch (Exception e) { e.printStackTrace(); delegate.onImageError(); //send error to activity } }

Al final, lo que tenemos es una class que puede llamar a un método en su Activity lugar de onActivityResult , pero cuando obtiene un resultado en onActivityResult , debe manejarlo en esa class