2012-01-20 13 views
11

Jeśli zadeklaruję LinearLayout linearLayout i spojrzę na linearLayout.getLayoutParams(), otrzymam ViewGroup.LayoutParams, a nie LinearLayout.LayoutParams.Dlaczego klasa LinearLayout instance.getLayoutParams ma nieprawidłową klasę?

Więc muszę używać powtarzania (a więc złe) budowę stylu z:

int lm = ((LinearLayout.LayoutParams) linearLayout.getLayoutParams()).leftMargin? 

Czy naprawdę trzeba go używać, jeśli chcę osiągnąć marże, na przykład?

Czy to moje niezrozumienie Androida lub Javy, lub obu, czy coś innego?

Odpowiedz

20

myślę o zrozumienie 'LayoutParams' jest niepoprawne. Widok (lub układ) LayoutParams musi być instancją "widoku LayoutParams widoku rodzica".

Na przykład tutaj jest LinearLayout w RelativeLayout. Te LayoutParams LinearLayout muszą być RelativeLayout.LayoutParams. Dzięki temu możemy poprawnie ustawiać atrybuty, takie jak "centerInParent" i inne.

Po wywołaniu getLayoutParams() zwraca różne instancje elementu LayoutParams, które pasują do rodzica ViewGroup. W rezultacie musimy wielokrotnie rzucać typem LayoutParams widoku, dzwoniąc pod numer getLayoutParams().

+1

Niestety, typ zwracany przez linearLayout.getLayoutParams nie ma nic wspólnego z klasą układu, która zawiera ten linearLayout. Jeśli chodzi o wygodę, przyznanie mi klasy nadrzędnej "LayoutParams jest bezsensowne - jeśli tego potrzebuję, mogę rzucić linearLayout do ViewsGroup i wziąć jej getLayputParams i mieć je uniwersalne. Ale Android daje mi * tylko * ViewsGroup.LayoutParams. – Gangnus

+1

Ponieważ jest niejednoznaczny, nie może zostać zwrócony określony typ LayoutParams, podczas gdy nie jest typowy. System nie może wiedzieć, jaki jest typ. Twoje pytanie jest dla mnie bezsensowne. – lulumeya

+0

Jeśli linearLayout ma klasę LinearLayout, funkcja linearLayout.getLayoutParams jest klasą LinearLayout i może łatwo zwrócić klasę LinearLayout.LayoutParams. Gdzie jest błąd? – Gangnus

1

Czy używasz platformy Eclipse i po prostu używasz opcji "Organizuj importy" Eclipse do importowania bibliotek Androida? Jeśli tak, istnieje kilka różnych bibliotek o nazwie LayourParams, Eclipse wydaje się importować framelayout, a nie liniowy, który potrzebujesz.

Po prostu zmień importowanie u góry swojej klasy.

+0

W klasie używam ViewGroups.getLayoutParams i LinearLayout.getLayoutParams. Nie mogę dodać importu android.widget.LinearLayout.LayoutParams zamiast importować android.view.ViewGroup.LayoutParams. Czy mogę w jakiś sposób użyć obu? – Gangnus

2

Nie rzucaj LinearLayout.LayoutParams do LinearLayout.LayoutParams. To nie ma sensu. Również nie jest jasne, czy linearLayout w kodzie jest zmienną instancji ... Tak czy inaczej, możesz po prostu odwołać się do LayoutParams wewnątrz widoku, który rozciąga się od jakiegoś widoku, aby uzyskać LayoutParams widoku. Na przykład, jeśli jesteś wewnątrz klasy, która rozciąga się od RelativeLayout, następnie

LayoutParams params = new LayoutParams(200, LayoutParams.WRAP_CONTENT); 

dostaje RelativeLayout.LayoutParams. W przeciwnym razie musisz zakwalifikować się na LayoutParams, którego szukasz. Aby uzyskać/zastosowanie LinearLayout LayoutParams, wystarczy

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(); 

EDIT

linearLayout.getLayoutParams() zwraca layoutParams że dostarczane kiedy nazywa setLayoutParams, więc najpierw upewnij się to zrobić. Następnie, gdy już to zrobisz, po prostu musisz rzucić LayoutParams, które zostały zwrócone do LayoutParams, którą ustawiłeś. więc

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) linearLayout.getLayoutParams() 

Ponadto, dlaczego musisz uzyskać takie parametry? Co chcesz osiągnąć w ostateczności? Pytam, ponieważ może być łatwiejszy sposób robienia tego, co próbujesz zrobić ...

W efekcie odpowiedź na twoje pytanie brzmi TAK, musisz rzucić LayoutParams, które otrzymujesz z getLayoutParams, ponieważ jest to metoda wywodzi się z klasy View, która zwraca nadklasę LayoutParams, która jest ViewGroup.LayoutParams, która z powodu polimorfizmu może być rzutowana na typ, który znacie.

+0

@Gangnus Nie wiem, o czym mówisz. Nie ma czegoś takiego jak LinearLayout.LayoutParams.rightMargin. Po prostu wywołujemy params.setMargins (int, int, int, int). – LuxuryMode

+0

Niestety, brakowało mi trzech liter w nazwie funkcji – Gangnus

+0

+1, aby uzyskać pomoc w znalezieniu błędów w wariancie początkowym pytania. Dziękuję Ci. Ale proszę, jeśli pomożesz w dalszym zadaniu, utwórz inną odpowiedź - pytanie zmieniło się znacząco. – Gangnus

0

Nie trzeba pobierać obiektu Paramount LinearLayout z samego LinearLayout. Możesz samodzielnie utworzyć nowy.

// Set up the height and width of the layout, you can set FILL_PARENT 
// or even WRAP_CONTENT 
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width, height); 
// Set up your margins 
lp.setMargins(left, top, right, bottom); 

teraz skorzystać z tej lp obiekt na LinearLayout obiektu instancji

linearLayout.setLayoutParams(lp); 
+0

Jeśli chcesz przeczytać leftMargin, nie musisz ustawiać nowych parametrów. Co więcej, nawet jeśli musisz * ustawić * leftMargin, nie chcesz naprawdę wymazać wszystkich innych parametrów układu. – Gangnus

6

Wystarczy umieścić go w bardzo prosty sposób:

Proszę pamiętać, że gdy pojawi się na LayoutParams z myślą, ich klasa jest określona przez klasę widoku macierzystego tego widoku.

Oznacza to jeden bardzo ważny fakt:

Masz do oddania LayoutParams z widokiem, ponieważ nie można wiedzieć wcześniej, co jest klasą rodzica. Tak więc, jeśli widok jest dominująca jest LinearLayout, to LayoutParams będzie od rodzaju LinearLayout.LayoutParams i STILL masz do oddania go do tego typu!


Nie mam pewności co do kodu źródłowego i jego przebiegu. Jest to jednak bardzo logiczne, ponieważ RelativeLayout.LayoutParams, na przykład, ma właściwości takie jak ABOVE i BELOW, które nie występują w LinearLayout.LayoutParams. A te parametry są w rzeczywistości zależne od rodzica.

+0

Chronione pole mLayoutParams, które jest używane do podania wyniku tej funkcji, należy do samego widoku, a nie do jego obiektu nadrzędnego. Powracające wartości, na przykład marginesy, należą do tego samego widoku. Jednostka nadrzędna może być dowolnym typem, wynikiem funkcji jest zawsze klasa ViewsGroup.LayoutParams, a nie w zależności od klasy jednostki nadrzędnej. Funkcja istnieje również dla układu głównego i nie ma rodziców, ekran jest jego rodzica. Jak myślisz, dlaczego ich klasa jest określona przez rodzica? Nie widzę sensu w tej myśli - wszystko jest przeciwko niej. – Gangnus

+0

Nie jestem pewien co do kodu źródłowego i jak to działa. Jest to jednak bardzo logiczne, ponieważ RelativeLayout.LayoutParams, na przykład, ma właściwości takie jak ABOVE i BELOW, które nie występują w LinearLayout.LayoutParams. A te parametry są w rzeczywistości zależne od rodzica. –

+0

Teraz widzę. A ponieważ dla różnych rodziców pola mogą być różne, dostaję referencje dla paramitów najbardziej prymitywnego rodzica, a później wyślę go do klasy, o której wiem, że zadowoli wszystkie pola, których potrzebuję. Bardzo skomplikowane, ale ma sens. --- Lulumeia powiedziała mi to wcześniej, ale twoje wyjaśnienie było zrozumiałe. Dziękuję i mam jackpot :-) – Gangnus

Powiązane problemy