Android: Показать диалог из класса

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

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

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


person Max Mumford    schedule 03.02.2012    source источник


Ответы (3)


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

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

    handler.post(new Runnable() {//show messagebox here});

Or

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

Будьте осторожны с утечками памяти с механизмом передачи контекста

ИЗМЕНИТЬ:

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

EDIT2 ПОСЛЕ КОММЕНТАРИЙ

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

В oncreate вашего класса активности с именем 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, когда закончите со своим объектом. Это может очень быстро привести к утечке памяти.

person Yahel    schedule 03.02.2012
comment
Я делаю это в данный момент, в конструкторе AlertBuilder.dialog есть ошибка, из-за которой вы не можете пройти в getApplicationContext(); единственное, что работает, это передать это из активности. Однако передача этого по-прежнему приводит к исключению недопустимого токена, упомянутому в потоке, на который я ссылался в своем посте... - person Max Mumford; 05.02.2012
comment
Насколько я понимаю из вашего сообщения, вы вовсе не делаете то, что я говорю вам попробовать: либо используйте обработчик, либо передайте контекст активности в свой класс, где вы сохраняете его как локальную переменную, которая будет использоваться специально в вызов алертдиалог. Кроме того, если я правильно понимаю, неработающий applicationContext не является ошибкой, поскольку applicationcontext не является ссылкой на поток пользовательского интерфейса. Я собираюсь обновить свой ответ некоторым кодом. - person Yahel; 06.02.2012
comment
Хорошо, я понимаю, поэтому вы говорите, что лучший способ показать диалоги - это класс активности. Причина, по которой я хотел иметь весь код диалога в самом представлении, заключалась в том, что везде, где развернуто представление, код обработки диалога будет одинаковым — также есть много кода диалога, который нужно будет каждый раз переписывать. Возможно, есть более простой способ обработки диалогов внутри действия, которое я не рассматривал? - person Max Mumford; 06.02.2012
comment
Если ваш объект будет повторно использоваться более чем в одном действии, то имеет смысл не использовать обработчик и использовать второй вариант, который я предоставил. Передайте вызывающую активность объекту в качестве параметра при создании. Я обновлю свой ответ некоторым кодом. - person Yahel; 07.02.2012

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

person Wesley Wiser    schedule 03.02.2012

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

getParent();

вместо этого. И, пожалуйста, покажите нам код

person Shahzad Imam    schedule 03.02.2012
comment
getParent в представлении возвращает объект ViewParent, который недопустим для отображения диалогового окна. Я также попытался передать действие в класс через конструктор и использовать getParent для того, что тоже не сработало... - person Max Mumford; 06.02.2012