2012-06-25 13 views
7

Estamos desarrollando una biblioteca que se utilizará tanto en JVM como en Android. Y ahora tenemos que implementar una notificación de período de prueba. En otras plataformas (.Net y Mac) que muestra un cuadro de mensaje emergente era suficiente. Pero hasta ahora no puedo encontrar una manera de hacer esto para Android.Cómo mostrar el mensaje emergente sin tener un contexto

El problema es que para mostrar algún mensaje (brindis o AlertDialog), necesito tener un contexto real. Pero dado que nuestra biblioteca no contiene elementos de la interfaz de usuario y no está relacionada con la interfaz de usuario de ninguna manera, no estamos pidiendo a un usuario que transfiera el contexto al crear componentes.

Para ser breve:

  • ¿Cómo puedo mostrar un pan tostado (AlertDialog, de notificación) sin tener un marco refference pasado de código de usuario.
  • Si no puedo, quizás alguien tenga mejores soluciones para implementar el modo de prueba en Android y Java.
+1

no se puede hacer nada sin un contexto. tal vez proporcione una interfaz para notificaciones y deje que el usuario implemente esta interfaz –

Respuesta

1

Parece que realmente no puede mostrar ni Toast ni AlertDialog sin tener un contexto. La variante más cercana es proporcionar alguna interfaz en su biblioteca que el usuario debe implementar.

3

Use Abstract factory pattern.

Su fábrica de resumen le permitirá crear cuadros de diálogo y otras notificaciones. Luego tendrá 2 implementaciones concretas que crean la versión de Android o la versión de JVM de la notificación.

Ejemplo:

/* 
* The abstract factory 
*/ 
public abstract class NotificationFactory { 
    /** 
    * Pops a message up for the user. 
    * 
    * @param msg 
    */ 
    public abstract void newToast(String msg); 

    // other notifications can go here 
} 

/** 
* Concrete Android notification factory 
* 
*/ 
public final class AndroidNotificationFactory extends NotificationFactory { 

    private final Context context; 

    public AndroidNotificationFactory(Context context) { 
     this.context = context; 
    } 

    @Override 
    public void newToast(String msg) { 
     // normal Android toast stuff using the context 
    } 

} 

/** 
* Concrete JVM Notification factory 
* 
*/ 
public final class JvmNotificationFactory extends NotificationFactory { 

    @Override 
    public void newToast(String msg) { 
     // JVM toast stuff 
    } 

} 

/** 
* A singleton used for accessing the factory. 
* 
*/ 
public enum Library { 
    Instance; 

    private NotificationFactory notificationFactory; 

    public NotificationFactory getNotificationFactory() { 
     // nb: add synchronized if needed 
     return notificationFactory; 
    } 

    public void setNotificationFactory(NotificationFactory notificationFactory) { 
     // nb: add synchronized if needed 
     this.notificationFactory = notificationFactory; 
    } 

    public void InitForAndroid(Context context) { 
     setNotificationFactory(new AndroidNotificationFactory(context)); 
    } 

    public void InitForJvm() { 
     setNotificationFactory(new JvmNotificationFactory()); 
    } 
} 

public class ExampleUsage { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     // init the library 
     // Library.Instance.InitForAndroid(context); //or: 
     Library.Instance.InitForJvm(); 

     // usage 
     Library.Instance.getNotificationFactory().newToast("Test"); 

    } 

} 

Con los cuadros de diálogo donde se necesita para ser capaz de llamar a los métodos de después de la creación, es necesario hacer una interfaz de IDialog y concretas envoltorios de Android y JVM que implementan esa interfaz.

+0

Gracias, este es un buen ejemplo de cómo mostrar las notificaciones de forma independiente de la plataforma. Pero la esencia de la pregunta es cómo obligar a mostrar la interfaz de usuario de mi biblioteca. Y parece que ahora, no puedo hacer esto sin referencia al contexto. – Antonio

Cuestiones relacionadas