Android: программно установите только одно дополнение текстового представления

Я хочу программно установить верхнее заполнение текстового представления. Я знаю, что вы можете сделать это с помощью метода setPadding(). Но проблема в том, что для этого метода требуется 4 параметра: левый, верхний, правый, нижний. Я не хочу менять левую, правую и нижнюю части, я просто хочу изменить верхний отступ.

Это возможно?


person Xander    schedule 21.03.2013    source источник


Ответы (6)


использовать

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

Настройте только те параметры, которые вам нужны, а остальные установите равными нулю.

Если вам нужно сохранить другие существующие отступы, используйте yourView.getPaddingLeft(), yourView.getPaddingTop() и так далее.

person Droidman    schedule 21.03.2013
comment
Но у других есть значение, и я хочу сохранить это значение, а не устанавливать для них 0. - person Xander; 21.03.2013
comment
Если вас беспокоит потеря существующего заполнения, вы можете передать в textView.getPaddingTop () (или внизу, слева, справа) значения, которые нужно сохранить. - person dymmeh; 21.03.2013
comment
@Merlin, поэтому просто повторно используйте существующее значение для заполнения других сторон, используя getPaddingTop (), getPaddingLeft () и так далее, как уже было сказано выше. - person Droidman; 21.03.2013
comment
Я использую тот же код, что и childTV.setPadding(0, 0, 0, 0);, но он не устанавливает отступ на 0. Основываясь на каком-то условии, я пытаюсь удалить дополнение, добавленное в файл xml. - person Inzimam Tariq IT; 10.02.2018
comment
Согласно setPadding документам: представление может добавлять пространство, необходимое для отображения полос прокрутки, в зависимости от стиля и видимости полос прокрутки. Таким образом, значения, возвращаемые getPaddingLeft (), getPaddingTop (), getPaddingRight () и getPaddingBottom (), могут отличаться от значений, установленных в этом вызове. Поэтому использование getPadding не во всех случаях надежно. Не зная точных правил (которые не приводятся), мне было бы неудобно использовать эту технику. - person big_m; 07.12.2019

Я обычно создаю простой служебный метод, чтобы не забыть или не разместить другие отступы:

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)
person pkk    schedule 29.10.2014

Kotlin Extension Solution

Вы можете добавить такую ​​переменную расширения для каждой конкретной стороны.

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

Чтобы обработать horizontal или vertical, сделайте что-нибудь вроде этого. Обратите внимание, что результат получения не имеет смысла, поэтому вы можете отключить его.

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

Чтобы использовать start или end и правильно работать с языками 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

person Gibolt    schedule 30.08.2020

Вы также можете использовать это

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;
}
person lenhuy2106    schedule 14.07.2018

Код ниже работает нормально.

float scale = getResources().getDisplayMetrics().density;
int dpAsPixels = (int) (sizeInDp*scale + 0.5f);
person murugan mani    schedule 09.07.2019

Расширение 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)
person Hacsi    schedule 09.02.2021