Android: Показать диалог из класса - PullRequest
0 голосов
/ 03 февраля 2012

Я написал класс, который расширяет класс View для отображения некоторых данных. Пользователь должен иметь возможность манипулировать этими данными, щелкая по ним и предлагая различные варианты в диалоговом окне.

Однако проблема, с которой я сталкиваюсь, заключается в том, что в Android для инициализации экземпляра AlertDialog.Builder необходимо передать «this» (как в действии), чтобы он работал (getApplicationContext () не работает - см. эту статью: Диалоговое окно «Невозможно добавить окно - нулевой токен не для приложения» с getApplication () в качестве контекста )

Как я могу обойти эту проблему и показать диалог из моего класса, который расширяет View?

Ответы [ 3 ]

3 голосов
/ 03 февраля 2012

Если вам нужно открыть окно сообщения из класса без представления, у вас есть два решения:

  • Использовать обработчики: http://developer.android.com/reference/android/os/Handler.html Создайте обработчик в вашем представлении, а затем передайте его вашему классу для хранения. Когда вы хотите позвонить в свой ящик сообщений, вы будете использовать

    handler.post (new Runnable () {// показать окно сообщения здесь});

Или

  • В вашем представлении Android, когда вы создаете экземпляр своего класса, передаете контекст конструктору вашего класса и затем сохраняете этот контекст. После этого вы сможете использовать его в своих почтовых ящиках.

Остерегайтесь утечек памяти в контексте передачи меканизма

РЕДАКТИРОВАТЬ:

Я писал код, чтобы научить вас использовать обработчики, когда я рискнул и пошел за документом. Обычно в этом нет ничего полезного, но для этого конкретного случая, о чудо, посмотрите, что я нашел, полный и простой для понимания пример кода того, как использовать обработчик и его механизм сообщений. Он скрыт под складным названием ("http://developer.android.com/guide/topics/ui/dialogs.html#ShowingAProgressBar"): http://developer.android.com/guide/topics/ui/dialogs.html#ShowingAProgressBar

РЕДАКТИРОВАТЬ 2 ПОСЛЕ КОММЕНТАРИЙ

Поскольку операционный орган хочет, чтобы его объект можно было повторно использовать в различных действиях, имеет смысл не использовать обработчики, а вместо этого передавать контекст (действительно, ссылку на вызывающее действие) объекту. Затем объект сможет использовать этот контекст в dialog.builder.

В созданном вами классе активности под названием MyActivity:

MyCustomObject myObject = new MyCustomObject(this);

В вашем классе объектов

Class MyCustomObject {
  private MyActivity mContext;

  void MyCustomObject(MyActivity context) {
    this.mContext = context;
  }

  private showDialog(String message) {
    AlertDialog.Builder alert = new AlertDialog.Builder(mContext);//we use the context
  }
}

НЕ ЗАБУДЬТЕ УНИЧТОЖИТЬ И УСТАВИТЬ ДИАЛОГ-СТРОИТЕЛЬ И mContext, когда вы закончите с вашим объектом. Это может привести к очень быстрой утечке памяти.

0 голосов
/ 03 февраля 2012

Вы, должно быть, опубликовали некоторый код, или попробуйте его с помощью

getParent();

вместо этого. И покажите нам какой-нибудь код

0 голосов
/ 03 февраля 2012

Используйте View.getContext () и передайте его в AlertDialog.Build экземпляр.

...