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 ??

Leem.fin
fuente
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);
Jave
fuente
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!

Chris Conway
fuente
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.

Miklos Jakab
fuente
18

Usando Kotlin y la biblioteca android-ktx, simplemente puedes hacer

view.updatePadding(top = 42)

Ver documentos aquí

Andrew Orobator
fuente
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 .

i2097i
fuente
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);
Sai Gopi N
fuente
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

Manikandan K
fuente
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);
Siddhartha Halder
fuente
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.

Bhagya
fuente