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

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

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

Ответы:


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самом деле более правильный, чем мой (хотя он все еще действителен).


Отлично, но теперь 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);

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);

1
LayoutInflater.from(context).inflate(R.layout.row_payment_gateway_item, null);

1
Вам предлагается предоставить пояснительный текст вместе с вашим кодом.
HansHirse

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.