2012-06-25 71 views
7

我們正在開發將在JVMAndroid中使用的庫。現在我們需要實施試用期通知。在其他平臺(.Net和Mac)中顯示彈出式消息框就足夠了。但到目前爲止,我無法找到一種方法來爲Android做到這一點。如何在沒有上下文的情況下顯示彈出消息

問題是,要顯示一些消息(吐司或AlertDialog),我需要一個實際的上下文。但是由於我們的庫不包含UI元素,並且不以任何方式與UI相關,所以我們不會要求用戶在創建組件時傳遞上下文。

要短:

  • 如何可以顯示一個吐司(AlertDialog,通知),而無需從用戶代碼傳遞的上下文REFFERENCE。
  • 如果我不能確定某人在Android和Java上實現試用模式有更好的解決方案。
+1

如果沒有上下文,你什麼都不能做。可能會提供通知界面並讓用戶實現此界面 –

回答

1

看來,如果沒有上下文,你確實不能顯示吐司和AlertDialog。最接近的變體是在用戶應該實現的庫中提供一些接口。

3

使用Abstract factory pattern

您的抽象工廠將允許您創建對話框和其他通知。然後你將有2個具體的實現來創建Android版本或通知的JVM版本。

例子:

/* 
* 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"); 

    } 

} 

有了,你需要能夠呼籲創建後方法對話框,你需要做的IDialog接口和實現接口的具體Android和JVM包裝。

+0

謝謝,這是一個很好的示例,說明如何以平臺無關的方式顯示通知。但問題的實質是如何強制從我的庫中顯示UI。現在看來,如果不參考上下文,我不能這樣做。 – Antonio

相關問題