Uvod
“Layout inflation” je termin koji označava postupak sa kojim se XML resurs parsira i konvertuje u View objekat.
Aktivnost ima svoju metodu setContentView() sa kojom inflate-uje svoj root view:
Primer
1 2 3 4 5 |
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.neki_view); } |
Ali konvertovanje drugih layout-a u View objekt (čime omogućavamo da elementi layout-a budu dostupni u kodu aktivnosti) možemo da uradimo na sledeće načine:
Metoda LayoutInflater.inflate()
Ovaj postupak se sastoji iz dva koraka:
- Pravljenje Inflater objekat
- Pozivanje inflate() metode
Pravljenje Inflater objekta
U aktivnosti
a) u okviru onCreate()
Ako smo u aktivnosti u sklopu onCreate() metode možemo da pristupimo ovom objektu jednostavno jer je dat kao parametrar metode onCreate():
1 |
View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) |
b) van onCreate() metode
Medjutim ako smo van onCreate() metode moramo mu pristipiti na drugačiji način koristeći getLayoutInflater() metodu:
1 |
LayoutInflater inflater = getLayoutInflater(); |
Van aktivnosti
a) Preko aktivnosti
Pa čak ako smo i van aktivnosti možemo mu pristupiti pozivajući aktivnost:
1 |
getActivity().getLayoutInflater(); |
b) Preko context-a
Koristeći metodu context.getSystemService(Class)
1 |
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); |
Primer
1 2 3 4 5 |
public MyAdapter(Context context, List<MyObject> objects) extends ArrayAdapter { super(context, 1, objects); /* We get the inflator in the constructor */ mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } |
ili na drugi način koristeći from() metod:
1 |
LayoutInflater inflater = LayoutInflater.from(context); |
Pozivanje inflate() metode
Pozivanjem “inflate()” metode se vrši konverzija:
1 |
public View inflate (int resource,ViewGroup root,boolean attachToRoot) |
Legenda:
- resource int: ID resursa
- root ViewGroup: Opciona vrednost koja predstavlja neki View group koji će da bude roditelj ovom view-u (ako je treći parametar “attachToRoot” setovan na true). Ova vrednost može pri pozivu funkcije da bude null!
- attachToRoot boolean: Kroz ovaj parametar se definiše šta će biti vraćeno iz metode. Ako je attachToRoot postavljen na true, onda je layout file navedena u prvom parametru inflate-ovana i priključena na ViewGroup definisan u drugom parametru, pa tada metod vraća ovaj kombinovani prikaz, sa ViewGroup kao root. Kada je attachToRoot false, layout file iz prvog parametra se inflate i vraća kao prikaz.
Primer
1 2 3 4 5 |
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main, container, false); return rootView; } |
U ovome primeru treći parametar je “false” pa naš view nije ubačen u parent view (ovde container). Ako želimo da view bude ubačen u neki parent view potrebno je da stavimo “true” ili da to naknadno uradimo sa dodatnim kodom koristeć metodu addView().
Primer
1 2 |
Button button = (Button) inflater.inflate(R.layout.custom_button, mLinearLayout, false); mLinearLayout.addView(button); |
NAPOMENA:
Postoji verzija i sa dva parametra (treći parametar je uvek true)
1 |
public View inflate (int resource, ViewGroup root) |
Statična metoda inflate() View klase
Za istu namenu može da se koristi i STATIČNA metoda View objekta inflate(). Ona u pozadini takodje koristi wrap-ovani inflater objekat čiji kod izgleda ovako:
1 2 3 4 |
public static View inflate(Context context, int resource, ViewGroup root) { LayoutInflater factory = LayoutInflater.from(context); return factory.inflate(resource, root); } |
Primer
Ova statićna metoda se najčešće koristi kod slučaja kada se definiše custom VIew:
1 2 3 |
public void init (Context context, AttributeSet attrs) { customView = inflate(context, R.layout.view_custom, this); } |
Što bi bilo poptuno jednako sledećem kodu uradjenom preko inflator objekta:
1 2 3 4 |
public void init (Context context, AttributeSet attrs) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); View customView = inflater.inflate(R.layout.view_custom, this, true); } |
Jedna od razlika je što u ovoj statičnoj metodi nemamo opciju sa tri parametra (to znači da je treći parametar uvek true)