7

JVMとの両方で使用されるライブラリを開発していますAndroid。次に、試用期間の通知を実装する必要があります。他のプラットフォーム (.Net および Mac) では、ポップアップ メッセージ ボックスを表示するだけで十分でした。しかし、これまでのところ、Android でこれを行う方法が見つかりません。

問題は、メッセージ (トーストまたは AlertDialog) を表示するには、実際のコンテキストが必要なことです。しかし、私たちのライブラリには UI 要素が含まれておらず、UI とはまったく関係がないため、コンポーネントを作成するときにユーザーにコンテキストを渡すように求めていません。

要するに:

  • ユーザー コードからコンテキスト参照を渡さずにトースト (アラート ダイアログ、通知) を表示するにはどうすればよいですか。
  • 私ができない場合は、Android と Java で試用モードを実装するためのより良い解決策があるかもしれません。
4

2 に答える 2

3

抽象ファクトリ パターンを使用します。

抽象ファクトリを使用すると、ダイアログやその他の通知を作成できます。次に、通知の Android バージョンまたは JVM バージョンを作成する 2 つの具体的な実装があります。

例:

/*
 * 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 ラッパーを作成する必要があります。

于 2012-06-25T17:03:43.350 に答える
1

It appears that you really can't show neither Toast nor AlertDialog without having a context. The most close variant is to provide some interface in your library that user should implement.

于 2013-07-26T18:48:26.977 に答える