2011-11-12 9 views
10

oto CodeAndroid: Ustaw marginesy w FrameLayout nie programmatically- pracy

FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) searchPin.getLayoutParams(); 
params.setMargins(135, 176, 0, 0); 
//params.leftMargin = 135; // also not worked 
//params.topMargin = 376; 
searchPin.setLayoutParams(params); 

Jeżeli kiedykolwiek, z xml jej robotniczej

android:layout_marginLeft="135dp" 

co może być przyczyną? czy czegoś brakuje!

-thnx

+0

http: // stackoverflow. com/questions/5401952/framelayout-margin-not-working – mathheadinclouds

Odpowiedz

17

Spróbuj tego:

params.gravity = Gravity.TOP; 
+2

lub nawet: params.gravity = Gravity.NO_GRAVITY; –

3

myślę co tracisz to, że podczas programowo ustawić parametry dla danego elementu, parametry te są faktycznie do macierzystej View, tak, że wie jak pozycjonować element. Parametry nie są cofane do samego elementu. Rozważ następujący przykład kodu. Zauważ też, że parametry układu są typu rodzica.

LinearLayout linearLayout = new LinearLayout(this); 

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.FILL_PARENT, 
    LinearLayout.LayoutParams.WRAP_CONTENT); 

layoutParams.setMargins(6,6,6,6); 

Button someButton=new Button(this); 
someButton.setText("some text"); 

linearLayout.addView(someButton, layoutParams); 
+0

Co powinienem zrobić dla elementu potomnego? Zamiast tego, czy muszę dodać dopełnienie dla rodzica - aby prawidłowo umieścić dziecko! –

+0

thnx człowiek, dopełnienie pracował z elementem dziecko. odpowiedź została dodana. –

+0

Nie, nie trzeba ustawiać dopełnienia dla elementu potomnego jako wypełnienia dla elementu nadrzędnego. Pomysł jest bardziej podobny, dostarczasz zarówno (element podrzędny + parametry układu elementu potomnego) do rodzica - jak w linii addView. – hovanessyan

2

prosty Roztwór podstawowy

searchPin = (ImageView) findViewById(R.id.waypts_search_pin); 
searchPin.setPadding(135, 176, 0, 0); 
+8

Cóż, to tak naprawdę nie pomaga innym osobom, które szukają odpowiedzi na twoje pytanie, wypełnianie nie przesuwa tło na ramie, tylko zawartość. – htafoya

-1

Wystarczy użyć LayoutParams zamiast FrameLayout.LayoutParams

LayoutParams params = (LayoutParams) searchPin.getLayoutParams(); 
params.setMargins(135, 176, 0, 0); 
searchPin.setLayoutParams(params); 

ten pracował dla mnie

+1

LayoutParams nie ma metody setMargins. Właśnie zaimportowałeś Android.widget.FrameLayout.LayoutParams – roarster

7

miałem FrameLayout dzieckiem RelativeLayout więc ramy próbował rzucić FrameLayout params do RelativeLayout, I rozwiązać ten sposób

FrameLayout mylayout = (FrameLayout) view.findViewById(R.id.mylayout); 
ViewGroup.MarginLayoutParams params = (MarginLayoutParams) mylayout.getLayoutParams(); 
params.setMargins(1, 2, 3, 4); 
mylayout.setLayoutParams(params); 
+0

, jeśli twój FrameLayout jest dzieckiem RelativeLayout. masz ustawiony RelativeLayout.LayoutParams na FrameLayout –

+0

Powyższy komentarz powinien być zaakceptowaną odpowiedzią. – Magicode

+0

Zgadzam się w/Roman Black: To jest rozwiązanie, które zadziałało dla mnie. Musisz ustawić parametry z typem rodzica. – mtbomb

0

możesz spróbować tej

FrameLayout.LayoutParams srcLp = (FrameLayout.LayoutParams)searchPin.getLayoutParams(); 
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(srcLp.width, srcLp.height, srcLp.gravity); 

lp.setMargins(srcLp.leftMargin, srcLp.topMargin, srcLp.rightMargin, srcLp.bottomMargin); 

searchPin.setLayoutParams(lp); 
Powiązane problemy