2016-06-13 14 views
0

Ich bin neu in Android .. so weiß ich nicht, ob ich eine dumme Frage stelle oder nicht. Sowieso ist es hier ..Warum müssen wir LayoutInflater in Android nicht instanziieren?

Wir wissen .. instanziiert wir ein Objekt in Java wie folgt:

Sagar sagarObject = new Sagar(); 

wo Sagar die Klasse

aber ich sah nur einen Code in Android, das ist :

LayoutInfalter sagarsInflater = LayoutInflater.from(getContext()); 

wo layoutInflater die Klasse ist.

Jetzt kann ich den obigen Code nicht verstehen. Sollte es nicht sein wie:

LayoutInflater sagarsInflater = new LayoutInflater(); 

Warum havent wir das Objekt instanziiert? Warum wird diese "from" -Methode ohne automatische Instantiierung automatisch verwendet?

Ein weiteres Beispiel,

View customView = sagarsInflater.inflate(R.layout.custom_row, parent, false); 

Auch hier haben wir das das Objekt aus der View-Klasse instanziiert wie:

View customView = new View(); 

Stattdessen haben wir die Methode der sagarsInflater, die wir früher gerade gemacht.

+1

Da '.from' eine statische Methode ist –

+0

1. weil LayoutInflater einen Kontext benötigt, um Informationen zu erhalten fx: über Themes ... ist es auch eine Factory-Methode - fx: Sie brauchen nicht mehrere LayoutInflater-Instanzen Kontext ... 2. Diejenigen zu Linien sind zueinander unwichtig ...Zuerst erstellen Sie die Ansicht von den Ressourcen in der zweiten. Sie erstellen die Ansicht programmgesteuert. – Selvin

Antwort

0

Bitte überprüfen Sie die Dokumentation https://developer.android.com/reference/android/view/LayoutInflater.html

//Obtains the LayoutInflater from the given context. 
static LayoutInflater.from(Context context) 

Sein statisch verwendet und kann nicht allein verwendet werden, wird der Kontext das Layout Inflater zurückzukehren.

+0

Und was ist mit der Ansicht? –

+0

der Inflater überbrückt die Ansicht von Xml nach Java – Haroon

0

LayoutInflater ist ein abstract class und kann nicht direkt instanziiert werden.

LayoutInflater und viele andere Systeme "Dienste" (in Form von abstract classes und interfaces) stammen aus den Context Ihrer Tätigkeit.

Wenn Sie vom "System" kommen, müssen Sie sich nicht mit der tatsächlichen Implementierung dieses Dienstes befassen; Das System kann verschiedene Implementierungen für verschiedene Situationen bereitstellen.

Dies ist wichtiger für einige der anderen Schnittstellen, die von Context z.B. AudioManager, SpeechRecognizer usw. können Sie die Liste in der Dokumentation zu Context

Die View Klasse für sich sehen, ist nicht visuell interessant. Es existiert hauptsächlich, um Unterklassen viele "eingebaute" Installationen (Standardimplementierungen) für allgemeine Operationen zu geben. Ich würde argumentieren, es sollte auch abstract sein. Sie könnten es geben etwas Verhalten über das Anfügen Handler aber in der Regel erstellen eine Unterklasse von View gibt Ihnen eine bessere Kontrolle über die Anpassung.

+0

Und was ist mit der Ansicht? –

+0

aktualisierte meine Antwort, plus einige der anderen Antworten. –

2

Zuallererst, auch wenn Sie denken, dass Sie etwas sehr grundlegendes fragen, wird es nie eine dumme Frage sein, wenn es etwas ist, das Sie nicht wissen.

Sie sollten die Dokumentation zum besseren Verständnis LayoutInflater überprüfen:

https://developer.android.com/reference/android/view/LayoutInflater.html

instanziert ein Layout XML-Datei in die entsprechenden Objekte anzeigen. Es wird nie direkt verwendet. Verwenden Sie stattdessen getLayoutInFlater() oder getSystemService (Class), um eine Standard-LayoutInFlater-Instanz abzurufen, die bereits an den aktuellen Kontext angeschlossen ist und korrekt konfiguriert für das Gerät ist, das Sie unter ausführen.

Sie müssen also eine vorhandene Instanz LayoutInflater aus dem Kontext abrufen, keine neue erstellen. Das ist, warum können Sie nicht so etwas wie

LayoutInflater inflater = new LayoutInflater(); 

Aus der Dokumentation verwenden Sie, dass der richtige Weg, um die LayoutInflater des Zugriffs finden ist:

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

Aber Sie verwenden LayoutInflater.from(Context context). Wenn wir ihre Umsetzung gehen finden wir den folgenden Code:

public static LayoutInflater from(Context context) { 
    LayoutInflater LayoutInflater = 
      (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    if (LayoutInflater == null) { 
     throw new AssertionError("LayoutInflater not found."); 
    } 
    return LayoutInflater; 
} 

Wir sehen es die layoutInflater aus dem Kontext als Argument übergeben abruft.

Über die Art, wie diese Methode aufgerufen wird, wird sie wie Class.method verwendet, da sie als statische definiert ist. Dies bedeutet, dass die Methode zur Klasse und nicht zur Instanz des Objekts gehört.

Für weitere Informationen über diese: https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

Für die Ansicht jeweiligen Frage zu verstehen:

Sie können ein Objekt anzeigen instanziiert wie

View view = new View(context); 

Die Ansicht Beispiel wird eine Ansicht Objekt sein mit Standardattribute, und es wird nicht an eine übergeordnete Ansicht angehängt. Sie verwenden dies zum Beispiel zum dynamischen Erstellen von Layouts aus Code.

Warum verwenden Sie inflater.inflate(int resource, ViewGroup root, boolean attachToRoot);?

Weil Sie eine Ansicht von einem XML-Layout aufblasen möchten. Und das verwenden wir für die LayoutInflater.

Wieder finden Sie die Dokumentation für eine bessere Erklärung:

LayoutInflater inflater

Hoffe, es hilft.

Verwandte Themen