Rufen Sie getLayoutInflater () an Orten auf, die nicht aktiv sind

189

Was muss importiert werden oder wie kann ich den Layout-Inflater an anderen Orten als bei Aktivitäten aufrufen?

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

Ich kann getLayoutInflaternur in Aktivität anrufen , ist das eine Einschränkung? Was ist, wenn ich ein benutzerdefiniertes Dialogfeld erstellen und die Ansicht dafür aufblasen möchte oder wenn ich eine Toastnachricht mit einer benutzerdefinierten Ansicht haben möchte, die von einem Dienst angezeigt wird? Ich habe nur den Kontext des Dienstes, für den ich keine Aktivität habe aber ich möchte benutzerdefinierte Nachricht anzeigen.

Ich brauche den Inflater an Stellen im Code, die nicht in der Aktivitätsklasse sind.

Wie kann ich das machen ?

Lukap
quelle

Antworten:

396

Sie können diese externen Aktivitäten verwenden. Sie müssen lediglich Folgendes bereitstellen Context:

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

Um dann Ihre verschiedenen Widgets abzurufen, blasen Sie ein Layout auf:

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

BEARBEITEN ab Juli 2014

Davides Antwort darauf, wie man das bekommt, LayoutInflaterist tatsächlich korrekter als meine (was aber immer noch gültig ist).

kaspermoerch
quelle
Großartig, aber jetzt funktioniert findViewById nicht mehr. Haben Sie Ideen dazu? inflater.inflate (R.layout.some_layout, (ViewGroup) findViewById (R.id.parent));
Lukap
Nein, die inflater.inflate () -Methode hat keine überladene Methode mit nur einem int-Parameter, aber ich denke, die nächste könnte null sein.
Lukap
@kaspermoerch warum hast du gesagt, Davids Antwort ist korrekter?
Rohan Bhatia
1
@RohanBhatia Davides Antwort erfordert kein Casting, was meine tut. Wenn der Aufruf von getSystemServiceaus irgendeinem (unwahrscheinlichen) Grund kein Objekt vom Typ LayoutInflaterzurückgibt, würde mein Code eine Laufzeitausnahme verursachen.
Kaspermoerch
Hat für mich gearbeitet. Danke
CodeFluid
260

Oder ...

LayoutInflater inflater = LayoutInflater.from(context);
Davide
quelle
5
Sehr spät, aber tatsächlich eine bessere Antwort, da die from-Funktion auch mit der Bestätigung prüft, dass Sie tatsächlich einen Inflater zurückbekommen, und ansonsten einen Fehler auslöst - was viel einfacher zu handhaben ist als eine Nullzeigerausnahme irgendwo im Code. grepcode.com/file/repository.grepcode.com/java/ext/…
Raanan
38
So kurz, viel aufblasen
Danyal Aytekin
@ David Bedeutet dieses Zitat, dass die Lösung von kaspermoerch besser ist als Ihre? "Es wird niemals direkt verwendet. Verwenden Sie stattdessen getLayoutInflater () oder getSystemService (Class), um eine Standard-LayoutInflater-Instanz abzurufen, die bereits mit dem aktuellen Kontext verbunden und für das Gerät, auf dem Sie ausgeführt werden, korrekt konfiguriert ist." developer.android.com/reference/android/view/LayoutInflater
Tamás Bolvári
@ TamásBolvári Ist nur einfacher und klarer, in der Tat ist die interne Implementierung die gleiche wie bei Kaspermoerch schreiben.
Davide
11

oder

View.inflate(context, layout, parent)

Prakash Nadar
quelle
Das ist gut ; Mit dieser Methode kann ich jedoch nicht den booleschen Wert "attachToRoot"
DenisGL
Es basiert auf der Anforderung, dass dies eine praktische Hilfsmethode ist oder getRootView () als übergeordnetes Element an die Methode übergeben wird, wenn Sie attachToRoot nicht benötigen.
Prakash Nadar
9

Mit dem Kontextobjekt können Sie LayoutInflater aus folgendem Code abrufen

LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
anujprashar
quelle
1
LayoutInflater.from(context).inflate(R.layout.row_payment_gateway_item, null);
Sikander Bakht
quelle
1
Wir empfehlen Ihnen, zusammen mit Ihrem Code einen erläuternden Text bereitzustellen.
HansHirse
1
LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );

Verwenden Sie dies stattdessen!

Brian Tompsett - 汤 莱恩
quelle