¿Hay una manera de llamar `overridePendingTransition` de una clase que no extiende la clase Activity?

Estoy usando otra clase para ejecutar algunas cosas en segundo plano mientras se está mostrando la actividad principal y pasar el contexto de esa actividad a esta clase de fondo. Estoy iniciando otra actividad de esta clase de fondo, pero no puedo llamar a overridePendingTransition aquí porque "method overridePendingTransition (int, int) está indefinido para el tipo BackgroundClass."

 public class GetUPC extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute() { ... } @Override protected Void doInBackground(Void... arg0) { ... boolean dairy; if(theDairy.equals("N")) { //milk test dairy=true; } else { dairy=false; } //depending on if there is a warning it will either display the warning screen or skip it if(dairy) { Intent intent_warn = new Intent(context, WarningScreen.class); intent_warn.putExtra("Name", str_name); intent_warn.putExtra("Size", str_size); intent_warn.putExtra("Price", str_price); intent_warn.putExtra("Carbs", str_carbs); intent_warn.putExtra("Protein", str_protein); intent_warn.putExtra("Fiber", str_fiber); intent_warn.putExtra("Sugar", str_sugar); intent_warn.putExtra("SatFat", str_satFat); intent_warn.putExtra("TotFat", str_totFat); intent_warn.putExtra("Cholesterol", str_cholesterol); intent_warn.putExtra("Sodium", str_sodium); intent_warn.putExtra("Potassium", str_potassium); intent_warn.putExtra("Calories", str_calories); intent_warn.putExtra("Warning", "Contains Dairy"); intent_warn.putExtra("WarningRed", true); Log.e("Warning",intent_warn.getExtras().getString("Warning")); context.startActivity(intent_warn); overridePendingTransition(R.layout.fade_in, R.layout.fade_out); //THIS PART ISN'T WORKING// } else { Intent intent_menu = new Intent(context, DisplayScreen.class); intent_menu.putExtra("Name", str_name); intent_menu.putExtra("Size", str_size); intent_menu.putExtra("Price", str_price); intent_menu.putExtra("Carbs", str_carbs); intent_menu.putExtra("Protein", str_protein); intent_menu.putExtra("Fiber", str_fiber); intent_menu.putExtra("Sugar", str_sugar); intent_menu.putExtra("SatFat", str_satFat); intent_menu.putExtra("TotFat", str_totFat); intent_menu.putExtra("Cholesterol", str_cholesterol); intent_menu.putExtra("Sodium", str_sodium); intent_menu.putExtra("Potassium", str_potassium); intent_menu.putExtra("Calories", str_calories); intent_menu.putExtra("Warning", "Contains no allergens"); intent_menu.putExtra("WarningRed", false); Log.e("Warning",intent_menu.getExtras().getString("Warning")); context.startActivity(intent_menu); } Log.e("KYLE_DATA_UPCH",str_name+" "+str_price+""+str_size); } } catch (JSONException e) { e.printStackTrace(); } } else { Log.e("ServiceHandler", "Couldn't get any data from the url"); _errorCode=3; } return null; } @Override protected void onPostExecute(Void result) { ... } } 

5 Solutions collect form web for “¿Hay una manera de llamar `overridePendingTransition` de una clase que no extiende la clase Activity?”

Así que en realidad era capaz de resolver el problema llamando overridePendingTransition en el contexto, casted a una actividad.

 ((Activity) context).overridePendingTransition(R.layout.fade_in, R.layout.fade_out); 

Me doy cuenta de que esta no es la mejor práctica y podría ser complicado con una aplicación más compleja, pero para nuestros propósitos ahora creo que esto está bien. Me gustaría investigar la solución de @bariscan Kayaoglu eventualmente, ya que parece más robusto.

Mejor crear una interfaz y callback su método.

 myInterface mInterface; public interface myInterface { public abstract void myTask(); } public GetUPC(myInterface mInterface) { this.mInterface = mInterface; } 

y en su método doInBackground, cuando haya terminado, llame al

 mInterface.myTask(); 

No olvide implementar su interfaz a su actividad y enviarla a su constructor cuando esté creando su tarea asíncrona.

 myAsyncTask = new GetUPC(this); 

Y su plataforma de desarrollo le informará para implementar métodos no implementados como myTask (). Puedes hacer lo que quieras en ese método mientras puedas acceder a tu actividad.

Sólo para añadir algo de seguridad a la respuesta de Tims, compruebe si el contexto es una instancia de Activity antes de lanzarla:

 if (context instanceof Activity) { ((Activity) context).overridePendingTransition(R.layout.fade_in, R.layout.fade_out); } 

Esto simplemente asegura que llame a un método que está realmente allí. También podría utilizar un try / catch, pero creo que esto será suficiente

No creo que sea una buena idea. Dado que su clase es una tarea asíncrona, la actividad que elija podría no ser la actividad activa, ya que su tarea asíncrona funcionará en segundo plano. Pero si considera fugas de memoria y punteros nulos, sólo puede enviar su actividad a su constructor.

No se puede hacer ninguna parte de actualización de interfaz de usuario desde el subproceso de fondo, pero si se desea hacer lo mismo, entonces reemplazar onProgressUpdate de AsyncTask clase y pasado su código de inicio de actividad en que. para invocar esta llamada methode publishProgress. Antes de comenzar la actividad usted tiene que cancelar su AsyncTask de lo contrario su aplicación agrietará.

  • Cómo hacer la animación de marco suave en Android?
  • Android elementos compartidos transición pre-21
  • Android: ¿No hay transición entre las actividades?
  • OverridePendingTransition en el adaptador gridview
  • Implementar página curl en android?
  • Conversión de imagen a vídeo con efecto de transición
  • ¿Cómo puedo repetir una transición para siempre?
  • Transición de elementos compartidos de Android entre fragmentos con vista de reciclaje y detalles
  • Desarrollador de Android se traslada a iOS - ¿Qué necesito saber?
  • Animar las transiciones selector / estado
  • Efectos de transición con Android ImageView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.