2011-11-12 12 views
10

aquí es el código-Android: Defina los márgenes en un FrameLayout no programmatically- trabajo

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

Donde quiera, xml de su trabajadora

android:layout_marginLeft="135dp" 

lo que puede ser la razón? ¡Me estoy perdiendo de algo!

-thnx

+0

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

Respuesta

17

Prueba esto:

params.gravity = Gravity.TOP; 
+2

o incluso: params.gravity = Gravity.NO_GRAVITY; –

3

Creo que lo que se está perdiendo es que, cuando se establece mediante programación los parámetros para un elemento, estos parámetros se proporcionan en realidad a los padres View, para que sepa cómo posicionar el elemento. Los parámetros no están establecidos en el elemento en sí. Considere el siguiente ejemplo de código. También tenga en cuenta que los parámetros de diseño son del tipo del elemento principal.

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

¿Qué debo hacer para el elemento secundario? En lugar de eso, ¿necesito agregar relleno para los padres, para colocar al niño de forma adecuada? –

+0

thnx hombre, relleno trabajado con elemento infantil. respuesta agregada –

+0

no, no tiene que establecer el relleno para el elemento secundario, como relleno para el elemento primario. La idea es más bien que proporcionas ambos (elemento hijo + parámetros de diseño del elemento hijo) al elemento primario, como en la línea addView. – hovanessyan

2

sencilla Solución

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

Bueno, esto realmente no ayuda a otras personas que están buscando una respuesta a su pregunta, Padding no mueve el fondo en el marco, solo los contenidos. – htafoya

-1

sólo tiene que utilizar en lugar de LayoutParams FrameLayout.LayoutParams

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

Esto funcionó para mí

+1

LayoutParams no tiene un método setMargins. Acabas de importar android.widget.FrameLayout.LayoutParams – roarster

7

tuviera un hijo FrameLayout de un RelativeLayout por lo que el marco estaba tratando de echar FrameLayout params a RelativeLayout, yo resuelto de esta manera

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

si su FrameLayout es hijo de RelativeLayout. usted tiene establecido RelativeLayout.LayoutParams en FrameLayout –

+0

El comentario anterior debe ser la respuesta aceptada. – Magicode

+0

de acuerdo con Roman Black: Esta es la solución que funcionó para mí. Necesita establecer los params con el tipo de padre. – mtbomb

0

Puede probar este

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); 
Cuestiones relacionadas