Вызов getLayoutInflater () в местах, где нет активности

190

Что нужно импортировать или как я могу вызвать разметку макета в местах, отличных от активности?

public static void method(Context context){
    //this doesn't work the getLayoutInflater method could not be found
    LayoutInflater inflater = getLayoutInflater();
    // this also doesn't work 
    LayoutInflater inflater = context.getLayoutInflater();
}

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

Мне нужен инфлятор в местах кода, которых нет в классе активности.

Как я могу это сделать ?

Lukap
источник

Ответы:

396

Вы можете использовать это вне деятельности - все, что вам нужно, это предоставить Context:

LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );

Затем, чтобы получить разные виджеты, вы раздуваете макет:

View view = inflater.inflate( R.layout.myNewInflatedLayout, null );
Button myButton = (Button) view.findViewById( R.id.myButton );

РЕДАКТИРОВАТЬ с июля 2014

Ответ Давиде о том, как его получить, на LayoutInflaterсамом деле более правильный, чем мой (хотя он все еще действителен).

kaspermoerch
источник
Отлично, но теперь findViewById не работает, у вас есть идеи по этому поводу? inflater.inflate (R.layout.some_layout, (ViewGroup) findViewById (R.id.parent));
Lukap
Нет, метод inflater.inflate () не имеет перегруженного метода только с одним параметром int, но я предполагаю, что следующий может быть нулевым.
Lukap
@kaspermoerch, почему ты сказал, что ответ Дэвида более правильный?
Рохан Бхатия
1
@RohanBhatia Davides ответ не требует кастинга, как мой. Если вызов по getSystemServiceкакой-либо (маловероятной) причине не возвращает объект типа, LayoutInflaterтогда мой код вызовет исключение времени выполнения.
kaspermoerch
Работал на меня. Спасибо
CodeFluid
261

Или ...

LayoutInflater inflater = LayoutInflater.from(context);
Davide
источник
5
Очень поздно, но на самом деле лучший ответ, так как функция from также проверяет с утверждением, что вы на самом деле вернули инфлятор, и в противном случае выдает ошибку - что будет намного легче иметь дело с исключением нулевого указателя в коде. grepcode.com/file/repository.grepcode.com/java/ext/…
Raanan
38
Настолько кратко, много раздувает
Danyal Aytekin
@ Davide Означает ли эта цитата, что решение kaspermoerch лучше вашего? «Он никогда не используется напрямую. Вместо этого используйте getLayoutInflater () или getSystemService (Class), чтобы получить стандартный экземпляр LayoutInflater, который уже подключен к текущему контексту и правильно настроен для устройства, на котором вы работаете». developer.android.com/reference/android/view/LayoutInflater
Тамас Болвари
@ TamásBolvári Это только проще и понятнее, на самом деле внутренняя реализация такая же, как пишет Kaspermoerch.
Давиде
11

или

View.inflate(context, layout, parent)

Пракаш Надар
источник
Это хорошо ; однако, с помощью этого метода я не могу предоставить логическое значение «attachToRoot»
DenisGL
Это основано на требовании: если вам не нужен attachToRoot, тогда это удобный вспомогательный метод или передача getRootView () в качестве родительского для метода.
Пракаш Надар
9

Используя объект контекста, вы можете получить LayoutInflater из следующего кода

LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
anujprashar
источник
1
LayoutInflater.from(context).inflate(R.layout.row_payment_gateway_item, null);
Сикандер Бахт
источник
1
Вам предлагается предоставить пояснительный текст вместе с вашим кодом.
HansHirse
1
LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );

Используйте это вместо этого!

Брайан Томпсетт - 汤 莱恩
источник