Llamar a un método no estático fuera de la clase

A menudo tengo que lidiar con este tipo de error al programar en Java en Android. Por ejemplo tengo una clase donde pongo una bandera.

public class ViewActivity extends Activity { ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); ... } 

En otra clase quiero restablecer el FLAG_KEEP_SCREEN_ON

 class DrawOnTop extends View { ... if (condition) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } 

pero esto no funciona, ya que tengo "El método getWindow no está definido para el tipo DrawOnTop".

Así que intento definir un método clearFlags en la clase ViewActivity

 void clearFlags() { getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } 

y para llamar desde la clase DrawOnTop:

  if (condition) { ViewActivity.clearFlags(); } 

Esto no trabaja tan bien: Consigo "no puede hacer una referencia estática al método no estático clearFlags () del tipo ViewActivity". Bueno, hagámoslo estático entonces.

 static void clearFlags() { getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } 

y luego obtengo "No se puede hacer una referencia estática al método no estático getWindow del tipo Actividad"

¿Cómo podría ejecutar tal declaración?

Si su clase DrawOnTop está anidada dentro de ViewActivity puede crear una variable de Context local y usarla para llamar a getWindow (). Si ese no es el caso entonces cree un receptor en su clase de actividad entonces de DawOnTop envíe una intención con su disparador para hacer lo que el trabajo es. No instanciar su clase de actividad, mala idea!

Puede enviar getWindow() como parámetro al método clearFlags . Llame a clearFlags(Window window) de su actividad: WindowHelper.getInstance().clearFlags(getWindow());

Clase de ayuda:

 public class WindowHelper { public static final WindowHelper instance = new WindowHelper(); public static WindowHelper getInstance() { return instance; } public void clearFlags(Window window) { window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } } 

He intentado implementar las soluciones sugeridas por Aksaçlı y esto resultó ser muy simple:

En la clase ViewActivity DrawonTop se llama de esta manera: mDrawOnTop = new DrawOnTop(this);

El constructor de la segunda clase contiene lo siguiente:

 public DrawOnTop(Context context) { super(context); 

Por ViewActivity.clearFlags(); tanto ViewActivity.clearFlags(); tiene simplemente que ser reescrito como ((ViewActivity)getContext()).clearFlags();

Tal vez debería referirse a un objeto inicializado en su método estático. Así que en lugar de:

 void clearFlags() { getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } 

debe crear una variable de instancia estática de su ventana:

 private static staticWindowInstance; void clearFlags() { getStaticWindowInstance().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } 

Para obtener más información, debe consultar el patrón de diseño Singleton .

  • Uso de Eclipse para androidSDK, cuando voy a correr, me da la advertencia: La partición de datos ya está en uso. ¡Los cambios no persistirán!
  • Html Audio en la vista web de Android
  • Android: crear calendarios personalizados con eventos
  • Decodificar archivo de imagen SVG (codificado como base64) en java
  • Android Studio Archivo JAR de Google que genera un error de límite de sobrecarga de GC
  • El proveedor de ubicación fusionado no obtiene ubicación a menos que GPS esté activado
  • Cómo configurar la versión de origen de la biblioteca Java en el proyecto de Android Studio
  • ¿Cómo se utiliza un valor hexadecimal para especificar el color en un LinearGradient en android
  • Dibujar objeto personalizado curvado en LIBGDX?
  • ¿Por qué Android dibuja Vista dentro de otra (con anchura y altura definidas en píxeles) de manera incorrecta?
  • Cambiar el ancho de AutoCompleteTextView en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.