2013-05-07 4 views
7

Widziałem niektóre widżety za pomocą addView i czasami addViewInLayout.Jaka jest różnica między addView i addViewInLayout

Jaka jest różnica między nimi? Co się stanie, jeśli wymienię jeden na inny?

Czy powinienem zachować flagę podczas układania i używać odpowiednio "addViewInLayout" lub "addView"?

Dzięki.

BR, Henry

PS. dodać więcej tagów: removeview, removeviewinlayout

Odpowiedz

15

on ogólnie zły pomysł, aby zadzwonić addView wewnątrz onLayout ponieważ addView wewnętrznie wyzwala requestLayout które w końcu wezwie onLayout. Kończysz więc układ, gdy jesteś w środku układu.

addViewInLayout to "bezpieczniejsza" wersja addView w przypadku, gdy naprawdę trzeba dodać nowy widok w onLayout. Zasadniczo nie uruchamia przejścia do layoutu (nie wywołuje ono requestLayout wewnętrznie).

Zobacz ten film (Android inżyniera) Więcej szczegółów: http://www.youtube.com/watch?v=HbAeTGoKG6k

5

addViewInLayout

Dodaje widok podczas układu. Jest to przydatne, jeśli w metodzie onLayout() konieczne jest dodanie większej liczby widoków (na przykład widok listy). Jeśli indeks jest ujemny, oznacza to umieszczenie go na końcu listy.

addView

Przypisywanie przekazywane LayoutParams przeszedł do widoku i dodać widok z okna.

* Uwaga: dodatek addView jest implementowany przez ViewManager, interfejs umożliwiający dodawanie i usuwanie widoków podrzędnych do działania, dzięki czemu można dodawać widoki do grupy ViewGroup w czasie wykonywania (DYNAMICZNIE). Należy również zauważyć, że metoda addViewInLayout jest chronioną metodą ViewGroup, więc jeśli tworzysz niestandardową grupę widoków, możesz wywołać metodę addViewInLayout() w metodzie onLayout().

uzyskać więcej zobacz this

+0

dzięki za odpowiedź. , ale są one po prostu kopiowane z przewodnika dla programistów Androida. i nie to, co naprawdę chcę wiedzieć. to, o co pytam, to "prawdziwa" różnica, , albo możesz powiedzieć różnicę w "kodzie". nadal dziękuję. – Henry

+0

To jest to, co wyjaśniłem addView można wywołać w dowolnym obiekcie grupy view AND addViewInLayout musi być wywołana metoda onLayout(), gdy tworzysz niestandardową grupę widoków. –

1

na przykład: mamy układ (mLayout) i chcesz dodać 2 widoki (View1, View2) do tego layout.so istnieją 2 sposoby (samo)

Przypadek 1: wystarczy użyć poniższy polecenia

mLayout.addView(view1); //onLayout() will be called first time 
mLayout.addView(view2); //onLayout() will be called second time after the first time. 

w tym przypadku, nie obchodzi funkcji onLayout(). to jest prosty kod źródłowy.

Przypadek 2: komplikować ale lepsze osiągi

//do something to <global variable> 
    bCheck = true; //check it in fuction onLayout() 
    requestLayout(); //use this function to call onLayout() function for only one time 
    //in onLayout() function of mLayout, you use addViewInLayout() 
    //addViewInLayout() dont call onLayout() function, so you can add 2 views with only one time to call onLayout() 
    //onLayout() is abstract function, so mLayout is a instant of subclass of ViewGroup (ex: RelativeLayout, LinearLayout....) 
    @Override 
    onLayout(boolean changed, int l, int t, int r, int b) 
      if(bCheck == true){ 
      v.addViewInLayout(view1); //add view1 to mLayout 
      v.addViewInLayout(view1); //add view2 to mLayout 
       bCheck = false; 
      } 

     } 
    }); 

nie mam czasu, aby go przetestować. każdy może mi pomóc uczynić go bardziej zrozumiałym.