Android:如何以编程方式设置TextView的一个内边距?

47

我想在程序中动态设置TextView的上部填充。我知道可以使用setPadding()方法来实现。但问题是,这个方法需要四个参数:左、上、右、下填充值。我只想更改上部填充值,不想更改左、右和下部填充值。

这是否可能?

7个回答

100

使用

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

只调整你需要的参数,将其他参数设为零。

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


但其他的变量有值,我想保留这个值,而不是将它们设为0。 - Xander
20
如果您担心丢失现有的内边距,可以传入textView.getPaddingTop()(或bottom、left、right)以保留这些值。 - dymmeh
@Merlin 所以只需使用上面已经提到的 getPaddingTop()、getPaddingLeft() 等方法来重复使用其他边缘填充的现有值。 - Droidman
我正在使用与 childTV.setPadding(0, 0, 0, 0); 相同的代码,但它并没有将padding设置为0。根据某些条件,我正在尝试去除在xml文件中添加的填充。 - Inzimam Tariq IT
根据setPadding文档:"视图可能会添加显示滚动条所需的空间,这取决于滚动条的样式和可见性。因此,从getPaddingLeft()、getPaddingTop()、getPaddingRight()和getPaddingBottom()返回的值可能与此调用中设置的值不同." 因此,在所有情况下都不能可靠地使用getPadding。如果不知道确切的规则(未给出),使用此技术会感到不舒服。 - big_m

23

我通常会创建一个简单的实用方法,只是为了不忘记或错放其他填充:

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

后续可像在XML中一样使用,提供dp单位:

Utils.setPaddingLeft(myExampleTextView, 10)

2

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

为了处理水平或垂直方向,可以像这样做。请注意,获取器的结果没有意义,因此可以禁用它。
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


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

0
一个 Kotlin 的 View 扩展,可以一次性为任何类型的 View 设置任意组合的边缘到相同的值:
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)

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

0

以下代码运行良好。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接