Frage Wo Padding gehen, wenn Hintergrund Drawable gesetzt?


Ich habe dieses Problem auf meinem EditText und Button Ansichten, wo ich eine schöne Polsterung für sie Abstand vom Text haben, aber wenn ich den Hintergrund mit ändern setBackgroundDrawable oder setBackgroundResource Diese Polsterung ist für immer verloren.


75
2018-04-10 19:32


Ursprung


Antworten:


Was ich fand, war das Hinzufügen eines 9-Patch als Hintergrund-Ressource zurücksetzen die Polsterung - obwohl interessanterweise, wenn ich eine Farbe oder nicht-9 Patch-Bild hinzugefügt, tat es nicht. Die Lösung bestand darin, die Füllwerte zu speichern, bevor der Hintergrund hinzugefügt wird, und sie anschließend erneut festzulegen.

private EditText value = (EditText) findViewById(R.id.value);

int pL = value.getPaddingLeft();
int pT = value.getPaddingTop();
int pR = value.getPaddingRight();
int pB = value.getPaddingBottom();

value.setBackgroundResource(R.drawable.bkg);
value.setPadding(pL, pT, pR, pB);

85
2018-02-25 05:58



Ich konnte das Element in ein anderes Layout einfügen, in diesem Fall a FrameLayout. Das hat es mir ermöglicht, den Hintergrund der FrameLayout ohne die Polsterung zu zerstören, die auf dem enthalten ist RelativeLayout.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/commentCell"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:background="@drawable/comment_cell_bg_single" >

    <RelativeLayout android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:padding="20dp" >

    <ImageView android:id="@+id/sourcePic"
               android:layout_height="75dp"
               android:layout_width="75dp"
               android:padding="5dp"
               android:background="@drawable/photoframe" 
     />
...

Die andere Möglichkeit besteht darin, sie nach dem Einstellen des Hintergrunds programmgesteuert einzustellen Drawable wie oben vorgeschlagen. Stellen Sie nur sicher, dass Sie die Pixel berechnen, um die Auflösung des Geräts zu korrigieren.


12
2017-07-03 19:16



Habe das nicht gründlich getestet, aber diese Methode könnte nützlich sein:

    /**
 * Sets the background for a view while preserving its current padding. If the background drawable
 * has its own padding, that padding will be added to the current padding.
 * 
 * @param view View to receive the new background.
 * @param backgroundDrawable Drawable to set as new background.
 */
public static void setBackgroundAndKeepPadding(View view, Drawable backgroundDrawable) {
    Rect drawablePadding = new Rect();
    backgroundDrawable.getPadding(drawablePadding);
    int top = view.getPaddingTop() + drawablePadding.top;
    int left = view.getPaddingLeft() + drawablePadding.left;
    int right = view.getPaddingRight() + drawablePadding.right;
    int bottom = view.getPaddingBottom() + drawablePadding.bottom;

    view.setBackgroundDrawable(backgroundDrawable);
    view.setPadding(left, top, right, bottom);
}

Verwenden Sie dies anstelle von view.setBackgroundDrawable (Drawable).


9
2018-01-24 00:08



Ich hatte dieses Problem in einem TextView, also unterordnete ich TextView und machte eine Override-Methode des TextView.setBackgroundResource(int resid) Methode. So was:

@Override
public void setBackgroundResource(int resid) {
    int pl = getPaddingLeft();
    int pt = getPaddingTop();
    int pr = getPaddingRight();
    int pb = getPaddingBottom();

    super.setBackgroundResource(resid);

    this.setPadding(pl, pt, pr, pb);
}

Auf diese Weise wird das Padding des Elements vor dem Festlegen der Ressource abgerufen, es wird jedoch nicht mit der ursprünglichen Funktionalität der Methode verwechselt, es wird lediglich das Padding beibehalten.


9
2018-01-01 22:14



Rückwärts kompatible Version von CottonBallPaws Antwort

/** 
  * Sets the background for a view while preserving its current     padding. If the background drawable 
  * has its own padding, that padding will be added to the current padding. 
 *  
 * @param view View to receive the new background. 
 * @param backgroundDrawable Drawable to set as new background. 
 */ 
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@SuppressWarnings("deprecation")
public static void setBackgroundAndKeepPadding(View view, Drawable backgroundDrawable) {
    Rect drawablePadding = new Rect();
    backgroundDrawable.getPadding(drawablePadding);
    int top = view.getPaddingTop() + drawablePadding.top;
    int left = view.getPaddingLeft() + drawablePadding.left;
    int right = view.getPaddingRight() + drawablePadding.right;
    int bottom = view.getPaddingBottom() + drawablePadding.bottom;

    int sdk = android.os.Build.VERSION.SDK_INT;
    if(sdk < android.os.Build.VERSION_CODES.JELLY_BEAN) {
        view.setBackgroundDrawable(backgroundDrawable);
    } else {
        view.setBackground(backgroundDrawable);
    }
    view.setPadding(left, top, right, bottom);
}

2
2017-09-16 22:07



Für allgemeine Sucher,

Fügen Sie einfach setPadding nach setBackgroudDrawable hinzu. Wenn Sie Ihren Zeichensatz ändern, müssen Sie setPadding erneut aufrufen.

Mögen:

view.setBackgroundDrawable(backgroundDrawable);
view.setPadding(x, x, x, x);

Am saubersten ist es, wenn Sie Ihre Paddings in einem xml-drawable definieren, das auf die drawable-image-Datei zeigt

Greating


1
2018-05-26 11:39



Meine Lösung war, die Sicht zu erweitern (in meinem Fall ein Text bearbeiten) und überschreiben setBackgroundDrawable() und setBackgroundResource() Methoden:

// Stores padding to avoid padding removed on background change issue
public void storePadding(){
    mPaddingLeft = getPaddingLeft();
    mPaddingBottom = getPaddingTop();
    mPaddingRight = getPaddingRight();
    mPaddingTop = getPaddingBottom();
}

// Restores padding to avoid padding removed on background change issue
private void restorePadding() {
    this.setPadding(mPaddingLeft, mPaddingTop, mPaddingRight, mPaddingBottom);
}

@Override
public void setBackgroundResource(@DrawableRes int resId) {
    storePadding();
    super.setBackgroundResource(resId);
    restorePadding();
}

@Override
public void setBackgroundDrawable(Drawable background) {
    storePadding();
    super.setBackgroundDrawable(background);
    restorePadding();
}

1
2018-03-09 18:15



Sie können eine Auffüllung vornehmen, indem Sie 9-Patch-Bilder verwenden und den Inhaltsbereich im Zeichenfeld definieren. Überprüfen Sie dies

Sie können die Auffüllung in Ihrem Layout auch über XML oder programmatisch festlegen

xml-Füllzeichen

android:padding
android:paddingLeft
android:paddingRight
android:paddingTop
android:paddingBottom

Sie können versuchen, das Padding manuell aus dem Code zu setzen, nachdem Sie setBackgroundDrawable aufgerufen haben, indem Sie setPadding auf Ihrem EditText oder Button Views aufgerufen haben


0
2018-04-10 19:39



Ändern Sie einfach lib zu v7: 22.1.0 in Android Studio wie folgt kompiliere 'com.android.support:appcompat-v7:22.1.0'


0
2018-06-29 09:12



Ich benutze diese ziemlich einfache Problemumgehung, die ich definiere accentColor in meinem style.xml Wie unten

<item name="colorAccent">#0288D1</item>

und dann benutze ich einen der folgenden Stile in meinem Button Stichworte

style="@style/Base.Widget.AppCompat.Button.Colored"
style="@style/Base.Widget.AppCompat.Button.Small"

beispielsweise :

<Button
    android:id="@+id/btnLink"
    style="@style/Base.Widget.AppCompat.Button.Colored"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/tvDescription"
    android:textColor="@color/textColorPrimary"
    android:text="Visit Website" />

<Button
    android:id="@+id/btnSave"
    style="@style/Base.Widget.AppCompat.Button.Small"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/tvDescription"
    android:layout_toRightOf="@id/btnLink"
    android:textColor="@color/textColorPrimaryInverse"
    android:text="Save" />

0
2017-09-30 17:03