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?
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
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)
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 px
agrega 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
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)
CoolMind
Usar actualizar relleno:
val top = resources.getDimensionPixelOffset(R.dimen.padding)
textView.updatePadding(top = value) // value in pixels