¿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 continuamente ejecutando TransitionDrawable animación en Android?
  • ¿Cómo desaparecer y entre dos imágenes?
  • Android: cómo animar una transición de actividad cuando se pulsa el botón de retroceso predeterminado
  • Animar las transiciones selector / estado
  • Desarrollador de Android se traslada a iOS - ¿Qué necesito saber?
  • ¿Cómo puedo configurar el valor alfa de una vista completa en el nivel 7 de api (Android 2.1)
  • La transición de Android no funciona en el teléfono
  • OverridePendingTransition en el adaptador gridview
  • ¿Cómo puedo repetir una transición para siempre?
  • Transición de animación entre actividades mediante FLAG_ACTIVITY_CLEAR_TOP
  • Animación de transición de actividad de izquierda a derecha en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.