Телефонуйте, щоб отримати 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 );

EDIT станом на липень 2014 року

Давіде в відповідь про те , як отримати LayoutInflaterнасправді більш правильним , ніж мій (який до сих пір діє , хоча).


Чудово, але зараз findViewById не працює, у вас є ідеї з цього приводу? inflater.inflate (R.layout.some_layout, (ViewGroup) findViewById (R.id.parent));
Лукап

nop, метод inflater.inflate () не має перевантаженого методу лише одним int-параметром, але я думаю, що наступний може бути нульовим.
Лукап

@kaspermoerch, чому ти сказав, що відповідь Девіда є правильнішою?
Рохан Бхатія

1
@RohanBhatia Давидів відповідь не вимагає відхилення, що це робить моя. Якщо виклик з 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ás Bolvári

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.