Как показать всплывающее сообщение без контекста

Мы разрабатываем библиотеку, которая будет использоваться как в JVM, так и в Android. Теперь нам нужно реализовать уведомление о пробном периоде. На других платформах (.Net и Mac) показа всплывающего окна сообщения было достаточно. Но пока я не могу найти способ сделать это для Android.

Проблема в том, что для отображения какого-либо сообщения (тоста или AlertDialog) мне нужен реальный контекст. Но поскольку наша библиотека не содержит элементов пользовательского интерфейса и никак не связана с пользовательским интерфейсом, мы не просим пользователя передавать контекст при создании компонентов.

Если быть кратким:

  • как я могу показать Toast (AlertDialog, Notification) без передачи контекстной ссылки из пользовательского кода.
  • Если я не могу, может быть, у кого-то есть лучшие решения для реализации пробного режима на Android и Java.

person antonv    schedule 25.06.2012    source источник
comment
вы ничего не можете сделать без контекста. возможно, предоставить интерфейс для уведомлений и позволить пользователю реализовать этот интерфейс   -  person Sherif elKhatib    schedule 25.06.2012


Ответы (2)


Используйте шаблон абстрактной фабрики.

Ваша абстрактная фабрика позволит вам создавать диалоги и другие уведомления. Тогда у вас будет 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, которые реализуют этот интерфейс.

person weston    schedule 25.06.2012
comment
Спасибо, это хороший пример того, как отображать уведомления независимо от платформы. Но суть вопроса в том, как заставить показывать UI из моей библиотеки. И кажется сейчас, что я не могу сделать это без привязки к контексту. - person antonv; 30.06.2012

Похоже, вы действительно не можете показать ни Toast, ни AlertDialog без контекста. Самый близкий вариант — предоставить какой-то интерфейс в вашей библиотеке, который должен реализовать пользователь.

person antonv    schedule 26.07.2013