Android: Legen Sie programmgesteuert nur eine Auffüllung der Textansicht fest

Lesezeit: 4 Minuten

Xanders Benutzeravatar
Xander

Ich möchte die obere Polsterung einer Textansicht programmgesteuert festlegen. Ich weiß, dass Sie dies mit der Methode tun können setPadding(). Das Problem ist jedoch, dass diese Methode 4 Parameter erfordert: links, oben, rechts, unten. Ich möchte nicht links, rechts und unten ändern, ich möchte nur die obere Polsterung ändern.

Ist das möglich?

Benutzeravatar von Droidman
Droidenmann

verwenden

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

Stellen Sie nur die Parameter ein, die Sie benötigen, und setzen Sie die anderen auf Null.

Wenn Sie andere vorhandene Polsterungen erhalten müssen, verwenden Sie yourView.getPaddingLeft(), yourView.getPaddingTop() usw.

  • Aber die anderen haben einen Wert, und ich möchte diesen Wert behalten und nicht auf 0 setzen.

    – Xander

    21. März 2013 um 19:18 Uhr


  • Wenn Sie befürchten, vorhandene Paddings zu verlieren, können Sie textView.getPaddingTop() (oder bottom,left,right) übergeben, damit die Werte erhalten bleiben

    – dymmeh

    21. März 2013 um 19:18 Uhr

  • @Merlin, verwenden Sie also einfach den vorhandenen Wert für das Auffüllen anderer Seiten, indem Sie getPaddingTop(), getPaddingLeft() usw. verwenden, wie bereits oben erwähnt

    – Droidenmann

    21. März 2013 um 19:20 Uhr


  • Ich verwende den gleichen Code wie childTV.setPadding(0, 0, 0, 0); aber es setzt die Auffüllung nicht auf 0. Basierend auf einer Bedingung versuche ich, die in der XML-Datei hinzugefügte Auffüllung zu entfernen.

    – Inzimam Tariq IT

    10. Februar 2018 um 11:00 Uhr

  • Laut dem setPadding docs: „Die Ansicht fügt möglicherweise den für die Anzeige der Bildlaufleisten erforderlichen Platz hinzu, je nach Stil und Sichtbarkeit der Bildlaufleisten. Daher können sich die von getPaddingLeft(), getPaddingTop(), getPaddingRight() und getPaddingBottom() zurückgegebenen Werte von unterscheiden die in diesem Aufruf gesetzten Werte.” Daher ist die Verwendung von getPadding nicht in allen Fällen zuverlässig. Ohne die genauen Regeln zu kennen (die nicht angegeben sind), würde ich mich bei dieser Technik unwohl fühlen.

    – big_m

    7. Dezember 2019 um 14:06 Uhr


Benutzeravatar von pkk
pkk

Normalerweise erstelle ich eine einfache Utility-Methode, nur um die anderen Paddings nicht zu vergessen oder zu verlegen:

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

Später so zu verwenden und dp-Einheiten bereitzustellen, als ob es in xmls wäre:

Utils.setPaddingLeft(myExampleTextView, 10)

Gibolts Benutzeravatar
Gibolt

Kotlin-Erweiterungslösung

Sie können eine Erweiterungsvariable wie diese für jede der spezifischen Seiten hinzufügen.

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

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

Wenn Sie verwenden möchten dp Anstatt von pxfüge so etwas hinzu:

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

Zu handhaben horizontal oder vertical, mach sowas. Beachten Sie, dass das Getter-Ergebnis keinen Sinn machen würde, also können Sie es deaktivieren.

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

Benutzen start oder end und RTL-Sprachen korrekt verarbeiten, müssen Sie Folgendes hinzufügen:

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

Bonus: Erstelle ein Äquivalent, das a braucht res. dh topPaddingRes

Benutzeravatar von lenhuy2106
lenhuy2106

Sie können dies auch verwenden

setPadding(view, 500, Padding.TOP);

mit Hilfe von a @IntDef Definition:

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

Der folgende Code funktioniert einwandfrei.

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

Eine kotlin View-Erweiterung, um jede Kombination der Kanten für jeden View-Typ auf einmal auf den gleichen Wert zu setzen:

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

Beispiel:

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

Benutzeravatar von CoolMind
CoolMind

Verwenden updatePadding:

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

1431780cookie-checkAndroid: Legen Sie programmgesteuert nur eine Auffüllung der Textansicht fest

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy