Android: configure solo un relleno de vista de texto mediante programación

4 minutos de lectura

Avatar de usuario de Xander
Xander

Quiero configurar el relleno superior de una vista de texto mediante programación. Sé que puedes hacer esto con el método setPadding(). Pero el problema es que este método requiere 4 parámetros: izquierda, arriba, derecha, abajo. No quiero cambiar la izquierda, la derecha y la parte inferior, solo quiero cambiar el relleno superior.

¿Es eso posible?

Avatar de usuario de Droidman
hombredroide

usar

    yourTextView.setPadding(0, 10, 0, 0);

Ajusta solo los parámetros que necesites y pon a cero los demás.

Si necesita conservar otros rellenos existentes, utilice yourView.getPaddingLeft(), yourView.getPaddingTop() y así.

  • Pero los otros tienen un valor, y quiero mantener ese valor, no establecerlos en 0.

    – Xander

    21 de marzo de 2013 a las 19:18


  • Si le preocupa perder el relleno existente, puede pasar textView.getPaddingTop() (o abajo, izquierda, derecha) para conservar los valores

    – dymmeh

    21 de marzo de 2013 a las 19:18

  • @Merlin, simplemente reutilice el valor existente para el relleno de otros lados usando getPaddingTop(), getPaddingLeft() y así sucesivamente como ya se dijo anteriormente

    – Droideman

    21 de marzo de 2013 a las 19:20


  • Estoy usando el mismo código como childTV.setPadding(0, 0, 0, 0); pero no establece el relleno en 0. Basado en alguna condición, estoy tratando de eliminar el agregado de relleno agregado en el archivo xml.

    – Inzimam Tariq TI

    10 de febrero de 2018 a las 11:00

  • De acuerdo con la setPadding docs: “La vista puede agregar el espacio requerido para mostrar las barras de desplazamiento, según el estilo y la visibilidad de las barras de desplazamiento. Por lo tanto, los valores devueltos por getPaddingLeft(), getPaddingTop(), getPaddingRight() y getPaddingBottom() pueden ser diferentes de los valores fijados en esta convocatoria.” Entonces, usar getPadding no es confiable en todos los casos. Sin conocer las reglas exactas (que no se dan), me sentiría incómodo usando esta técnica.

    – grande_m

    7 de diciembre de 2019 a las 14:06


avatar de usuario de pkk
pkk

Por lo general, creo un método de utilidad simple solo para no olvidar o perder los otros rellenos:

public static void setPaddingLeft(View v, int leftPaddingDp) {
    int leftPaddingPx = dpToPx(leftPaddingDp);
    v.setPadding(leftPaddingPx, v.getPaddingTop(), v.getPaddingRight(), v.getPaddingBottom());
}

Para ser utilizado más tarde así, suministrando unidades dp, como si fuera en xmls:

Utils.setPaddingLeft(myExampleTextView, 10)

Avatar de usuario de Gibolt
Gibolt

Solución de extensión de Kotlin

Puede agregar una variable de extensión como esta para cada uno de los lados específicos.

inline var View.topPadding: Int
    get() = paddingTop
    set(@Px value) = setPadding(paddingLeft, value, paddingRight, paddingBottom)

// Then call
myView.topPadding = 10 // px

Si quieres usar dp en vez de pxagrega algo como esto:

inline var View.rightPaddingDp: Float
    get() = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, paddingRight.toFloat(), resources.displayMetrics) 
    set(value) {
        val rightPx = resources.displayMetrics.density * value
        setPadding(paddingLeft, paddingTop, rightPx.toInt(), paddingBottom)
    }

myView.rightPaddingDp = 10 // dp

Manejar horizontal o vertical, haz algo como esto. Tenga en cuenta que el resultado del captador no tendría sentido, por lo que puede desactivarlo.

inline var View.horizontalPadding: Int
    get() = throw UnsupportedOperationException("No getter for property")
    set(@Px value) = setPadding(value, paddingTop, value, paddingBottom)

Usar start o end y manejar correctamente los lenguajes RTL, deberá agregar esto:

inline val View.isLtr get() = SDK_INT < 17 || layoutDirection == View.LAYOUT_DIRECTION_LTR

inline var View.startPadding: Int
    get() = if (isLtr) paddingLeft else paddingRight
    set(@Px value) {
        val left = if (isLtr) value else paddingLeft
        val right = if (isLtr) paddingRight else value
        setPadding(left, paddingTop, right, paddingBottom)
    }

Prima: Haz un equivalente que tome un res. es decir topPaddingRes

avatar de usuario de lenhuy2106
lenhuy2106

También puedes usar esto

setPadding(view, 500, Padding.TOP);

con ayuda de un @IntDef definición:

public static void setPadding(View view, int padding, @Padding.Direction int direction) {
    switch (direction) {
        case Padding.LEFT:
            view.setPadding(padding, view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom());
            return;
        case Padding.RIGHT:
            view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), padding, view.getPaddingBottom());
            return;
        case Padding.TOP:
            view.setPadding(view.getPaddingLeft(), padding, view.getPaddingRight(), view.getPaddingBottom());
            return;
        case Padding.BOTTOM:
            view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), view.getPaddingRight(), padding);
            return;
        default:
    }
}

public static class Padding {
    @IntDef({Padding.LEFT, Padding.RIGHT, Padding.TOP, Padding.BOTTOM})
    @Retention(RetentionPolicy.SOURCE)
    public @interface Direction {}
    public static final int LEFT = 0;
    public static final int RIGHT = 1;
    public static final int TOP = 2;
    public static final int BOTTOM = 3;
}

El siguiente código funciona bien.

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

Una extensión de vista de kotlin para establecer cualquier combinación de los bordes en el mismo valor de una sola vez para cualquier tipo de vista:

enum class Edge{
    TOP,
    LEFT,
    BOTTOM,
    RIGHT
}
fun View.padding(edges:Set<Edge>, value:Int){
    var top    = paddingTop
    var left   = paddingLeft
    var bottom = paddingBottom
    var right  = paddingRight
    for(edge in edges){
        when(edge){
            Edge.TOP    -> top    = value
            Edge.LEFT   -> left   = value
            Edge.BOTTOM -> bottom = value
            Edge.RIGHT  -> right  = value
        }
    }
    setPadding(left, top, right, bottom)
}

Ejemplo:

someView.padding(setOf(Edge.RIGHT, Edge.LEFT), 50)

Avatar de usuario de CoolMind
CoolMind

Usar actualizar relleno:

val top = resources.getDimensionPixelOffset(R.dimen.padding)
textView.updatePadding(top = value) // value in pixels

¿Ha sido útil esta solución?