2011-10-18 12 views
141

Co należy zaimportować lub jak wywołać pompowanie układu w miejscach innych niż działalność?Zadzwoń do getLayoutInflater() w miejscach, które nie są w działalności

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

jestem w stanie nazwać getLayoutInflater tylko w działalności, jest to, że ograniczenia? Co zrobić, jeśli chcę utworzyć niestandardowe okno dialogowe i chcę nadmuchać widok dla niego lub co jeśli chcę mieć komunikat Toast z niestandardowym widokiem wyświetlanym z usługi, mam tylko kontekst z usługi, której nie mam żadnej aktywności ale chcę pokazać niestandardową wiadomość.

Potrzebuję pompowania w miejscach w kodzie, który nie znajduje się w klasie aktywności.

Jak mogę to zrobić?

Odpowiedz

327

Można wykorzystać te poza działania - wszystko, co potrzebne jest, aby zapewnić Context:

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

Następnie odzyskać swoje różne widgety, nadmuchać układ:

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

EDYTUJ od lipca 2014 r.

Davide's answer o tym, jak uzyskać LayoutInflater jest rzeczywiście bardziej poprawne niż moje (co jest nadal ważne).

+0

świetnie, ale obecnie nie findViewById pracujesz, czy masz jakieś pomysły na ten temat? inflater.inflate (R.layout.some_layout, (ViewGroup) findViewById (R.id.parent)); – Lukap

+0

Edytowałem swoją odpowiedź, aby pasowało do Twojego pytania. – kaspermoerch

+0

nop, metoda inflater.inflate() nie ma przeciążonej metody z tylko jednym parametrem int, ale myślę, że następny może być pusty. – Lukap

9

Korzystanie kontekst obiektu można dostać LayoutInflater od następujący kod

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

albo ...

LayoutInflater inflater = LayoutInflater.from(context); 
+5

Bardzo późno, ale w rzeczywistości lepsza odpowiedź, ponieważ funkcja "from" sprawdza również z assert, że faktycznie dostajesz pompkę z powrotem i zgłasza błąd w inny sposób - który będzie znacznie łatwiejszy w obsłudze, a następnie zniknięcie wskaźnika pustego gdzieś w kodzie. http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/view/LayoutInflater.java#LayoutInflater.from%28android.content. Kontekst% 29 – Raanan

+32

Taki krótki, dużo zawyżony –

+0

WOW ... Uwal mnie od tego ... Thz – Zugor

8

lub

View.inflate(context, layout, parent)

+0

W porządku; jednak za pomocą tej metody nie mogę zapewnić boolean "attachToRoot" – DenisGL

+0

Jest on oparty na wymaganiu, jeśli nie potrzebujesz attachToRoot, to jest wygodna metoda pomocnicza lub pass getRootView() jako rodzic metody. –

Powiązane problemy