Когда разрешено приведение контекста к действию? - PullRequest
3 голосов
/ 17 мая 2011

В методе showAlret(String message, Context ctx) класса Dialog оповещения я пытаюсь получить ссылку на TextView в XML-формате макета диалога:

TextView tv = (TextView)((MyActivity)ctx).findViewById(R.id.tv_about);

Не перед вызовом inflate (), конечно:

LayoutInflater li = LayoutInflater.from(ctx);
View view = li.inflate(R.layout.aboutdialog, null);

Проблема в том, что этот вызов возвращает tv как null .

Поскольку код компилируется без каких-либо предупреждений, я предполагаю, что это связано с «незаконным» приведением Context к MyActivity.

Я встречал довольно много случаев, когда приведение Context к Activity - единственное, что действительно работает, так почему же это не работает в этом случае?

Когда имеет смысл приведение контекста к действию?

Каковы "невысказанные правила" в этом отношении?

Ответы [ 4 ]

3 голосов
/ 17 мая 2011
LayoutInflater li = LayoutInflater.from(ctx);
View view = li.inflate(R.layout.aboutdialog, null);
TextView tv = view.findViewById(R.id.tv_about);

Я понимаю, что ваше текстовое представление является частью диалогового окна xml, поэтому вам нужно найти ViewById () в диалоговом окне вместо действия.

1 голос
/ 17 мая 2011

Я нашел решение. Моя ошибка заключалась в том, что я делал:

TextView tv = (TextView)((MyActivity)ctx).findViewById(R.id.tv_about);

Вместо:

TextView tv = (TextView)view.findViewById(R.id.tv_about);
1 голос
/ 17 мая 2011

Нет, это не иначе, у вас будет исключение. Вы уверены, что ваша активность загрузила TextView из xml в тот момент, когда вы пытаетесь его получить?

0 голосов
/ 09 апреля 2014

С другой стороны, вы можете привести контекст к действию, если оно является действием. Контекст - это базовый класс для Activity.

Вы должны приводить к Activity только тогда, когда ваш метод недоступен для объекта Context. Кастинг - это просто способ сообщить компилятору, что вы уверены, что это Activity, поэтому компилятор посчитает, что вы знаете, что делаете.

...