Was bedeutet es, eine Ansicht aus einer XML-Datei aufzublasen?

278

Ich bin neu in der Android-Entwicklung und stoße immer wieder auf Verweise auf das Aufblasen von Ansichten aus einer Layout-XML-Datei. Ich habe gegoogelt und den Entwicklungsleitfaden durchsucht, konnte aber immer noch nicht verstehen, was das bedeutet. Wenn jemand ein sehr einfaches Beispiel liefern könnte, wäre es sehr dankbar.

Brendan Weinstein
quelle

Antworten:

257

Wenn Sie ein XML-Layout schreiben, wird es vom Android-Betriebssystem aufgeblasen, was im Grunde bedeutet, dass es durch Erstellen eines Ansichtsobjekts im Speicher gerendert wird. Nennen wir das implizite Inflation (das Betriebssystem wird die Sicht für Sie aufblähen). Zum Beispiel:

class Name extends Activity{
    public void onCreate(){
         // the OS will inflate the your_layout.xml
         // file and use it for this activity
         setContentView(R.layout.your_layout);
    }
}

Sie können Ansichten auch explizit aufblasen, indem Sie die LayoutInflater. In diesem Fall müssen Sie:

  1. Holen Sie sich eine Instanz der LayoutInflater
  2. Geben Sie das aufzublasende XML an
  3. Verwenden Sie die zurückgegebenen View
  4. Stellen Sie die Inhaltsansicht mit der zurückgegebenen Ansicht ein (oben).

Zum Beispiel:

LayoutInflater inflater = LayoutInflater.from(YourActivity.this); // 1
View theInflatedView = inflater.inflate(R.layout.your_layout, null); // 2 and 3
setContentView(theInflatedView) // 4
Cristian
quelle
24
Wenn inflate = rendering, wozu dient dann genau onDraw ()?
PypeBros
@sylvainulg, Die R.id.view wird verwendet, um die Attribute des XML-Elements zu ändern, und inflate kann dasselbe tun. Das Aufblasen ist besonders in benutzerdefinierten Ansichten nützlich. Zum Aufblasen der gesamten XML-Datei wird die bekannte Klasse setContentView of Activity verwendet. Eine Ansicht muss jede Ansicht manuell mit LayoutInflater object.inflate () aufblasen. Eine Aktivität hat einen Lebenszyklus. Eine Ansicht hat stattdessen einen Zeichenzyklus. inflater ist besonders nützlich bei benutzerdefinierten Ansichten, anstatt das Predifiend-Layout in XML-Dateien zu verwenden.
Sree Rama
@Cristian Bitte, denkst du, du könntest mir hier ein paar Ratschläge / Ideen geben ? Goo.gl/E37NSu
eddy
24
Ich denke nicht, dass das Aufblasen das Rendern ist, sondern das Aufblasen die tatsächliche Erstellung eines View-Objekts im Speicher basierend auf dem Inhalt der XML-Datei. Nach dem Aufblasen ist die Ansicht im Speicher nicht unbedingt sichtbar.
Ahmed
1
@ MattJ. Nun, meine Antwort könnte schlecht formuliert sein. Android vergrößert die Ansicht nicht nur, indem es das XML irgendwo hat, sondern wenn Sie setContentView aufrufen oder das Layout manuell aufblasen. Zum Zeitpunkt des Aufrufs befinden sich findViewByIddie Ansichtsobjekte bereits im Speicher. Der einzige Grund, warum Sie dies tun, besteht darin, einen Verweis auf dieses bestimmte Objekt abzurufen (entweder um es zu ändern oder um Daten daraus abzurufen).
Cristian
159

Das "Aufblasen" einer Ansicht bedeutet, dass Sie das Layout-XML nehmen und analysieren, um die Ansichts- und Ansichtsgruppenobjekte aus den darin angegebenen Elementen und Attributen zu erstellen, und dann die Hierarchie dieser Ansichten und Ansichtsgruppen zur übergeordneten ViewGroup hinzufügen. Wenn Sie setContentView () aufrufen, werden die Ansichten, die beim Lesen des XML erstellt werden, an die Aktivität angehängt. Sie können LayoutInflater auch verwenden, um einer anderen ViewGroup Ansichten hinzuzufügen. Dies kann unter vielen Umständen ein nützliches Werkzeug sein.

jjb
quelle
22
das klingt für mich nach einer viel genaueren Beschreibung.
PypeBros
4
Ich bin immer noch ein bisschen verwirrt von der "Inflation" -Terminologie. (Wenn ich nur aufhören könnte, mir vorzustellen, wie Luft in etwas eindringt). Aber vielleicht hilft das: Ich habe gerade das Entpackungsprogramm an einem Ubuntu-Terminal ausgeführt und die Terminologie "Aufblasen: X / Y / z.xml" bemerkt. Ich nehme an, es ist wirklich das gleiche Konzept.
Ben Ogorek
6
"Aufblasen" bedeutet in diesem Fall, dass das Framework die Layoutbeschreibung aus dem XML übernimmt und die Ansichtshierarchie mit tatsächlichen Ansichtsobjekten füllt. Es bläst sich also auf, indem es das Layout ausfüllt.
JJB
1
@ FranciscoCorrales - Sicher. Am häufigsten verwenden Sie diese Art von Dingen für einen ListAdapter , in dem Sie eine Zeile füllen möchten. Ich habe es verwendet, um Dinge wie LinearLayouts zu füllen und ein Datenobjekt auf eine Weise zu durchlaufen, die den ListAdapter-Ansatz nicht vorschlug.
JJB
36

Beim Aufblasen wird der Aktivität zur Laufzeit eine Ansicht (.xml) hinzugefügt. Wenn wir eine Listenansicht erstellen, blasen wir jedes ihrer Elemente dynamisch auf. Wenn wir eine ViewGroup mit mehreren Ansichten wie Schaltflächen und Textansicht erstellen möchten, können wir sie folgendermaßen erstellen:

Button but = new Button();
but.setText ="button text";
but.background ...
but.leftDrawable.. and so on...

TextView txt = new TextView();
txt.setText ="button text";
txt.background ... and so on...

Dann müssen wir ein Layout erstellen, in dem wir die obigen Ansichten hinzufügen können:

RelativeLayout rel = new RelativeLayout();

rel.addView(but);

Und jetzt, wenn wir eine Schaltfläche in der rechten Ecke und eine Textansicht in der unteren Ecke hinzufügen möchten, müssen wir viel Arbeit leisten. Zuerst instanziieren Sie die Ansichtseigenschaften und wenden dann mehrere Einschränkungen an. Dies ist zeitaufwändig.

Android macht es uns einfach, eine einfache XML-Datei zu erstellen, ihren Stil und ihre Attribute in XML zu entwerfen und sie dann einfach überall dort aufzublasen, wo wir sie benötigen, ohne Einschränkungen programmgesteuert festlegen zu müssen.

LayoutInflater inflater = 
              (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View menuLayout = inflater.inflate(R.layout.your_menu_layout, mainLayout, true);
//now add menuLayout to wherever you want to add like

(RelativeLayout)findViewById(R.id.relative).addView(menuLayout);
Zar E Ahmer
quelle
Mir gefällt, wie Sie beschrieben haben, was Inflation eigentlich ist, indem Sie zeigen, wie Sie es manuell tun würden.
Daniel
1
Was bedeutet der Inflate-Parameter attachToRoot?
Flz
Siehe detaillierte Antwort stackoverflow.com/questions/12567578/…
Zar E Ahmer
5

Ich denke hier bedeutet "Aufblasen einer Ansicht" das Abrufen der Datei layout.xml, wobei eine in dieser XML-Datei angegebene Ansicht gezeichnet wird, und das POPULIEREN (= Aufblasen) der übergeordneten viewGroup mit der erstellten Ansicht.

Jaydeep Ranipa
quelle
4

Eine Laiendefinition für Inflation könnte darin bestehen, den XML-Code in Java-Code umzuwandeln. Nur um zu verstehen, z. B. wenn wir ein Tag in XML haben, muss das Betriebssystem ein entsprechendes Java-Objekt im Speicher erstellen, damit inflatter die XML-Tags liest und die entsprechenden Objekte in Java erstellt.

user3458211
quelle
2

Da wir die Benutzeroberfläche in XML umwandeln, aber Ansichtsobjekte anzeigen, müssen wir XML irgendwie in Ansichtsobjekte konvertieren, sodass das Aufblasen bedeutet, dass wir XML in Ansichtsobjekte konvertieren, damit es angezeigt werden kann. Dazu benötigen wir einen Dienst namens Layout Inflator-Dienst und gib ihm eine XML und es wird für dich konvertiert.

Schwarzer Falke
quelle