Agregue relleno en la vista mediante programación


235

Estoy desarrollando la aplicación Android v2.2.

Tengo un fragmento .

En la onCreateView(...)devolución de llamada de mi clase de fragmento, inflo un diseño al fragmento como a continuación:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.login, null);

    return view;
}

El archivo de diseño inflado anterior es (login.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" 
 >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Username" />


    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Username" />

</LinearLayout>

Me gustaría establecer paddingTopa en el <LinearLayout>elemento anterior , y quiero hacerlo en el código Java en lugar de hacerlo en xml.

Cómo establecer paddingTopque <LinearLayout>en mi fragmento de código de clase Java ??


2
Deberá asignar una ID a su LinearLayout para poder encontrarlo findViewByIdy luego llamarlo setPadding.
Aleks G

@AleksG En general, sí, pero dado que LinearLayout es el elemento raíz de la jerarquía inflada que no es necesaria aquí. viewya es LinearLayout, no es necesario encontrarlo nuevamente en este caso. Sin embargo, dado que este es especial.

1
@alextsc: sí, de acuerdo. Sin embargo, todavía prefiero asignar identificaciones a cualquier cosa a la que me refiera en la solicitud.
Aleks G

Respuestas:


486

view.setPadding(0,padding,0,0);

Esto establecerá el relleno superior a padding-píxeles.

Si desea configurarlo en su dplugar, puede hacer una conversión :

float scale = getResources().getDisplayMetrics().density;
int dpAsPixels = (int) (sizeInDp*scale + 0.5f);

66
@ Leem.fin como dice Chris, son píxeles. Si quieres dp, tendrás que hacer la conversión manualmente:float scale = getResources().getDisplayMetrics().density; int size = (int) (sizeInPx*scale + 0.5f);
Jave

77
¿De dónde viene el 0.5f?
Herr von Wurst

11
@Georg Ese código se toma de aquí: developer.android.com/guide/practices/… El 0.5 se usa para obtener el número entero más cercano al lanzar (en lugar de usar Math.round ())
Jave

Creo que los nombres de las variables deberían ser al revés: en sizeInDprealidad es el número de píxeles que obtienes al convertir sizeInPxdps.
friederbluemle

99

Para responder a su segunda pregunta:

view.setPadding(0,padding,0,0);

como sugirieron SpK y Jave, establecerá el relleno en píxeles. Puede configurarlo en dp calculando el valor de dp de la siguiente manera:

int paddingDp = 25;
float density = context.getResources().getDisplayMetrics().density
int paddingPixel = (int)(paddingDp * density);
view.setPadding(0,paddingPixel,0,0);

¡Espero que ayude!


3
Por supuesto, esto compilará y funcionará como se esperaba, pero en aras de la claridad, debe cambiar el nombre de sus variables int. Porque define su relleno en DP y calcula lo que sería en píxeles para este dispositivo dado.
Glenn85

Estás convirtiendo dp a píxel. Los nombres de las variables son confusos. "paddingPixel" realmente significa dp
Jiechao Wang

92

Si almacena el relleno en archivos de recursos, simplemente puede llamar

int padding = getResources().getDimensionPixelOffset(R.dimen.padding);

Hace la conversión por ti.




9

El uso TypedValuees una forma mucho más limpia de convertir a píxeles en comparación con el cálculo manual:

float paddingDp = 10f;
// Convert to pixels
int paddingPx = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, paddingDp, context.getResources().getDisplayMetrics());
view.setPadding(paddingPx, paddingPx, paddingPx, paddingPx);

Básicamente, TypedValue.applyDimensionconvierte el relleno deseado en píxeles de forma adecuada según las propiedades de visualización del dispositivo actual.

Para obtener más información, consulte: TypedValue.applyDimension Docs .


1
¿No deberían invertirse px y dp?
chris838

Creo que la esencia de lo que estoy haciendo es correcta. Sin embargo, el nombre es confuso, creo. Lo editaré para que quede más claro. Gracias por la respuesta.
i2097i

7

use el siguiente método para configurar el relleno dinámicamente

setPadding(int left, int top, int right, int bottom)

Ejemplo:

view.setPadding(2,2,2,2);

3

Escriba el código siguiente para configurar el relleno, puede ayudarlo.

TextView ApplyPaddingTextView = (TextView)findViewById(R.id.textView1);
final LayoutParams layoutparams = (RelativeLayout.LayoutParams) ApplyPaddingTextView.getLayoutParams();

layoutparams.setPadding(50,50,50,50);

ApplyPaddingTextView.setLayoutParams(layoutparams);

Usar LinearLayout.LayoutParamso RelativeLayout.LayoutParamssegún el diseño principal de la vista secundaria


setPadding () no es un método accesible desde LayoutParams. No estoy seguro si alguna vez lo fue.
Sriram

2
Context contect=MainActivity.this;
TextView tview=new TextView(context);
tview.setPaddingRelative(10,0,0,0);

44
Gracias por este fragmento de código, que puede proporcionar una ayuda limitada e inmediata. Una explicación adecuada mejoraría enormemente su valor a largo plazo al mostrar por qué esta es una buena solución al problema y la haría más útil para futuros lectores con otras preguntas similares. Por favor, editar su respuesta a añadir un poco de explicación, incluyendo los supuestos realizados.
Capricornio

0

Mientras rellena mediante programación, convierta a valores relacionados con la densidad mediante la conversión de píxeles a Dp.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.