Android:以编程方式设置textview的一个填充

时间:2013-03-21 19:13:37

标签: java android android-layout padding textview

我想以编程方式设置textview的顶部填充。我知道你可以用方法setPadding()来做到这一点。但问题是这种方法需要4个参数:左,上,右,下。我不想改变左,右和底,我只是想改变顶部填充。

这可能吗?

6 个答案:

答案 0 :(得分:67)

使用

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

仅调整所需的参数,并将其他参数设置为零。

如果您需要保留其他现有的填充,请使用yourView.getPaddingLeft()yourView.getPaddingTop()等。

答案 1 :(得分:18)

我通常会创建一个简单的实用工具方法,以免忘记或错放其他填充:

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

稍后要像这样使用,提供dp单位,就像在xmls中一样:

Utils.setPaddingLeft(myExampleTextView, 10)

答案 2 :(得分:0)

您也可以使用此

setPadding(view, 500, Padding.TOP);

借助 @IntDef 定义:

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

答案 3 :(得分:0)

下面的代码工作正常。

from fooTable2 d2

答案 4 :(得分:0)

Kotlin扩展解决方案

您可以为每个特定方面添加这样的扩展变量。

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

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

如果要使用dp而不是px,请添加以下内容:

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

要处理horizontalvertical,请执行以下操作。请注意,getter结果没有意义,因此您可以将其禁用。

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

要使用startend并正确处理RTL语言,您需要添加以下内容:

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

奖金:制作一个等价的res。即topPaddingRes

答案 5 :(得分:0)

一个 kotlin 视图扩展,用于一次性将任意边组合设置为相同值,适用于任何视图类型:

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

示例:

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