Co to znaczy zawyżać widok z pliku xml?

278

Jestem nowy w tworzeniu Androida i wciąż napotykam odniesienia do nadmuchiwania widoków z pliku xml układu. Poszukałem w Google i przeszukałem przewodnik programistyczny, ale nadal nie byłem w stanie wyczuć, co to znaczy. Jeśli ktoś mógłby podać bardzo prosty przykład, byłby bardzo wdzięczny.

Brendan Weinstein
źródło

Odpowiedzi:

257

Gdy piszesz układ XML, zostanie on zawyżony przez system operacyjny Android, co w zasadzie oznacza, że ​​zostanie on zrenderowany poprzez utworzenie obiektu widoku w pamięci. Nazwijmy tę ukrytą inflacją (system operacyjny zawyży dla ciebie widok). Na przykład:

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

Możesz także zawyżać liczbę wyświetleń, używając LayoutInflater. W takim przypadku musisz:

  1. Uzyskaj instancję LayoutInflater
  2. Podaj XML, który ma zostać zawyżony
  3. Użyj zwróconego View
  4. Ustaw widok zawartości w widoku zwróconym (powyżej)

Na przykład:

LayoutInflater inflater = LayoutInflater.from(YourActivity.this); // 1
View theInflatedView = inflater.inflate(R.layout.your_layout, null); // 2 and 3
setContentView(theInflatedView) // 4
Cristian
źródło
24
if inflate = rendering, to po co onDraw (), dokładnie?
PypeBros,
@sylvainulg, widok R.id. służy do zmiany atrybutów elementu xml, a inflacja może zrobić to samo. pompowanie jest szczególnie przydatne w niestandardowych widokach. Aby napompować cały plik xml, używany jest znany setContentView klasy Activity. Widok musi nadmuchać każdy widok ręcznie za pomocą LayoutInflater object.inflate (). Działanie ma cykl życia. Zamiast tego widok ma cykl rysowania. inflater jest szczególnie przydatny w widoku niestandardowym zamiast w układzie predefiniowanym w pliku XML.
Sree Rama
@Cristian Proszę, czy myślisz, że mógłbyś dać mi jakieś porady / pomysły tutaj goo.gl/E37NSu
eddy
24
Nie sądzę, aby pompowanie renderowało, a raczej pompowanie było faktycznym tworzeniem obiektu View w pamięci na podstawie zawartości pliku xml. Po nadmuchaniu widok będzie w pamięci niekoniecznie widoczny.
Ahmed,
1
@MattJ. Cóż, moja odpowiedź może być źle sformułowana. Android nadmuchuje widok nie tylko poprzez umieszczenie gdzieś kodu XML, ale także podczas wywołania setContentView lub ręcznego nadmuchania układu. Do czasu wywołania findViewByIdwidoku obiekty są już w pamięci, a jedynym powodem, dla którego to robisz, jest uzyskanie odniesienia do tego konkretnego obiektu (albo go zmienić, albo pobrać z niego dane).
Cristian
160

„Napompowanie” widoku oznacza pobranie kodu XML układu i parsowanie go w celu utworzenia widoku i obiektów grupy widoków z elementów i ich atrybutów określonych w obrębie, a następnie dodanie hierarchii tych widoków i grup widoków do nadrzędnej grupy ViewGroup. Kiedy wywołujesz setContentView (), dołącza on widoki utworzone przez odczyt XML do działania. Możesz także użyć LayoutInflater, aby dodać widoki do innej grupy ViewGroup, która może być przydatnym narzędziem w wielu okolicznościach.

jjb
źródło
22
brzmi to dla mnie o wiele dokładniejszy opis.
PypeBros,
4
Nadal jestem trochę zdezorientowany terminologią „inflacja”. (Gdybym tylko mógł przestać wyobrażać sobie, jak powietrze wpada w coś). Ale może to pomoże: właśnie uruchomiłem program do rozpakowywania na terminalu Ubuntu i zauważyłem terminologię: „pompowanie: X / Y / z.xml”. Przypuszczam, że to naprawdę ta sama koncepcja.
Ben Ogorek
6
„Pompowanie” w tym przypadku oznacza, że ​​środowisko pobiera opis układu z XML i zapełnia hierarchię widoków rzeczywistymi obiektami View. Tak więc pompuje się w sensie wypełnienia układu.
jjb
1
@FranciscoCorrales - Pewnie. Najczęstszą rzeczą, do której używasz tego rodzaju rzeczy, jest coś takiego jak ListAdapter , w którym chcesz wypełnić wiersz. Użyłem go do wypełnienia rzeczy takich jak LinearLayouts, iterując niektóre obiekty danych w sposób, który nie sugerowałby podejścia ListAdapter.
jjb
36

Napompowanie to proces dodawania widoku (.xml) do aktywności w środowisku wykonawczym. Kiedy tworzymy listView, dynamicznie nadmuchujemy każdy z jego elementów. Jeśli chcemy utworzyć grupę ViewGroup z wieloma widokami, takimi jak przyciski i widok tekstu, możemy ją utworzyć w następujący sposób:

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

Następnie musimy stworzyć układ, w którym możemy dodać powyższe widoki:

RelativeLayout rel = new RelativeLayout();

rel.addView(but);

A teraz, jeśli chcemy dodać przycisk w prawym rogu i widok tekstu na dole, musimy wykonać dużo pracy. Najpierw przez utworzenie właściwości widoku, a następnie zastosowanie wielu wiązań. To jest czasochłonne.

Android ułatwia nam utworzenie prostego pliku .xml oraz zaprojektowanie jego stylu i atrybutów w formacie xml, a następnie po prostu nadmuchanie go w dowolnym miejscu, bez potrzeby programowego ustawiania ograniczeń.

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
źródło
Podoba mi się, jak opisałeś, czym właściwie jest inflacja, pokazując, jak zrobiłbyś to ręcznie.
Daniel
1
Co oznacza parametr inflate attachToRoot?
flz
Zobacz szczegółową odpowiedź stackoverflow.com/questions/12567578/…
Zar E Ahmer
5

Myślę, że tutaj „pompowanie widoku” oznacza pobranie pliku layout.xml rysującego widok określony w tym pliku xml i POPULOWANIE (= pompowanie) nadrzędnej grupy widoków z utworzonym widokiem.

Jaydeep Ranipa
źródło
4

Świecką definicją inflacji może być konwersja kodu XML na kod Java. Tylko sposób na zrozumienie, np. Jeśli mamy znacznik w XML, OS musi utworzyć odpowiedni obiekt Java w pamięci, więc inflatter odczytuje znaczniki XML i tworzy odpowiednie obiekty w Javie.

użytkownik3458211
źródło
2

Ponieważ przekształcamy interfejs użytkownika w XML, ale wyświetlamy obiekty, więc w jakiś sposób musimy przekonwertować xml w obiekty widoku, więc pompowanie oznacza, że ​​przekształcamy xml w obiekty widoku, aby można je było wyświetlić, w tym celu potrzebujemy usługi o nazwie usługa inflatora układu i daj mu xml, a zostanie dla ciebie przekonwertowany.

czarny Jastrząb
źródło