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ć ?

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


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

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)


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

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

1
Zachęcamy do podania tekstu wyjaśniającego wraz z kodem.
HansHirse

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.