Wywołanie metody getLayoutInflater () w miejscach, w których nie ma aktywności

190

Co trzeba zaimportować lub jak mogę nazwać inflator układu w miejscach innych niż aktywność?

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

Mogę dzwonić getLayoutInflatertylko w działaniu, czy to ograniczenie? Co jeśli chcę utworzyć niestandardowe okno dialogowe i chcę zawęzić dla niego widok, lub co jeśli chcę mieć wiadomość Toast z niestandardowym widokiem, która jest wyświetlana z usługi, mam kontekst tylko z usługi Nie mam żadnej aktywności ale chcę pokazać niestandardową wiadomość.

Potrzebuję inflatora w miejscach w kodzie, które nie należą do klasy aktywności.

W jaki sposób mogę to zrobić ?

Lukap
źródło

Odpowiedzi:

396

Możesz skorzystać z tych działań zewnętrznych - wszystko czego potrzebujesz to Context:

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

Następnie, aby pobrać różne widżety, nadmuchujesz układ:

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

EDYCJA od lipca 2014 r

Odpowiedź Davide'a na temat tego, jak ją uzyskać, LayoutInflaterjest w rzeczywistości bardziej poprawna niż moja (która wciąż jest aktualna).

kaspermoerch
źródło
Świetnie, ale teraz findViewById nie działa, czy masz jakieś pomysły na ten temat? inflater.inflate (R.layout.some_layout, (ViewGroup) findViewById (R.id.parent));
Lukap
nop, metoda inflater.inflate () nie miała przeciążonej metody za pomocą tylko jednego parametru int, ale myślę, że następny może mieć wartość null.
Lukap
@kaspermoerch, dlaczego powiedziałeś, że odpowiedź Davida jest bardziej poprawna?
Rohan Bhatia,
1
@RohanBhatia Davides odpowiedź nie wymaga rzutowania, co moja. Jeśli wywołanie z getSystemServicejakiegoś (mało prawdopodobnego) powodu nie zwróci obiektu typu, LayoutInflaterwówczas mój kod spowoduje wyjątek czasu wykonywania.
kaspermoerch
Pracował dla mnie. Dzięki
CodeFluid,
261

Lub ...

LayoutInflater inflater = LayoutInflater.from(context);
Davide
źródło
5
Bardzo późno, ale tak naprawdę lepsza odpowiedź, ponieważ funkcja from sprawdza również z zapewnieniem, że faktycznie dostajesz inflator z powrotem i generuje błąd w przeciwnym razie - co znacznie łatwiej poradzić sobie z wykluczeniem wskaźnika zerowego gdzieś w kodzie. grepcode.com/file/repository.grepcode.com/java/ext/…
Raanan
38
Taki krótki, bardzo napompowany
Danyal Aytekin
@Davide Czy ten cytat oznacza, że ​​rozwiązanie kaspermoerch jest lepsze niż twoje? „Nigdy nie jest używany bezpośrednio. Zamiast tego użyj getLayoutInflater () lub getSystemService (Class), aby pobrać standardową instancję LayoutInflater, która jest już podłączona do bieżącego kontekstu i poprawnie skonfigurowana dla urządzenia, na którym pracujesz.” developer.android.com/reference/android/view/LayoutInflater
Tamás Bolvári
@ TamásBolvári Jest tylko łatwiejsze i bardziej przejrzyste, w rzeczywistości wewnętrzna implementacja jest taka sama jak w przypadku Kaspermoerch.
Davide
11

lub

View.inflate(context, layout, parent)

Prakash Nadar
źródło
W porządku ; jednak za pomocą tej metody nie mogę dostarczyć logicznego „attachToRoot”
DenisGL
Opiera się na wymaganiu, jeśli nie potrzebujesz attachToRoot, jest to wygodna metoda pomocnicza lub przekazujesz getRootView () jako metodę nadrzędną dla metody.
Prakash Nadar
9

Za pomocą obiektu kontekstowego można uzyskać LayoutInflater z następującego kodu

LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
anujprashar
źródło
1
LayoutInflater.from(context).inflate(R.layout.row_payment_gateway_item, null);
Sikander Bakht
źródło
1
Zachęcamy do podania tekstu wyjaśniającego wraz z kodem.
HansHirse
1
LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );

Użyj tego zamiast tego!

Brian Tompsett - 汤 莱恩
źródło