91

EditTextビューとビューにこの問題がButtonあり、テキストから離れた場所に適切なパディングがありますが、背景をsetBackgroundDrawableまたはで変更すると、setBackgroundResourceそのパディングは永久に失われます。

4

17 に答える 17

102

私が見つけたのは、パディングをリセットするバックグラウンド リソースとして 9 パッチを追加することでした。興味深いことに、カラーまたは 9 以外のパッチ イメージを追加した場合はそうではありませんでした。解決策は、背景が追加される前にパディング値を保存し、後で再度設定することでした。

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);
于 2013-02-25T05:58:33.380 に答える
14

要素を別のレイアウト(この場合は。)内にラップすることができましたFrameLayoutFrameLayoutこれにより、含まれているパディングを破壊することなく、の背景を変更することができました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" 
     />
...

もう1つのオプションは、上記のように背景を設定した後、プログラムで設定するDrawableことです。デバイスの解像度を補正するために、必ずピクセルを計算してください。

于 2012-07-03T19:16:31.687 に答える
12

TextView でこの問題が発生したため、TextView をサブクラス化し、メソッドの Override メソッドを作成しましたTextView.setBackgroundResource(int resid)。このような:

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

このようにして、リソースを設定する前にアイテムのパディングを取得しますが、パディングを保持する以外に、メソッドの元の機能を実際に混乱させることはありません。

于 2014-01-01T22:14:21.093 に答える
9

このスーパーを徹底的にテストしていませんが、この方法は役立つかもしれません:

    /**
 * 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);
}

view.setBackgroundDrawable(Drawable) の代わりにこれを使用します。

于 2013-01-24T00:08:04.583 に答える
1

9 パッチ イメージを使用し、ドローアブルのコンテンツ領域を定義することで、いくらかのパディングを行うことができます。 これをチェックして

xml から、またはプログラムでレイアウトのパディングを設定することもできます

xml パディング タグ

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

EditText または Button ビューで setPadding を呼び出して setBackgroundDrawable を呼び出した後、コードからパディングを手動で設定することができます。

于 2012-04-10T19:39:24.437 に答える
1

私の解決策は、ビュー(私の場合はEditText)とオーバーライドsetBackgroundDrawable()setBackgroundResource()メソッドを拡張することでした:

// 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();
}
于 2017-03-09T18:15:47.483 に答える
0

このコンパイル 'com.android.support:appcompat-v7:22.1.0' のように、Androidスタジオでlibをv7:22.1.0に変更するだけです

于 2015-06-29T09:12:36.120 に答える
0

ほとんどの答えは正しいですが、背景設定を正しく処理する必要があります。

最初にビューのパディングを取得します

//Here my view has the same padding in all directions so I need to get just 1 padding
int padding = myView.getPaddingTop();

次に背景を設定します

//If your are supporting lower OS versions make sure to verify the version
if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) {
    //getDrawable was deprecated so use ContextCompat                            
    myView.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.bg_accent_underlined_white));
} else {
    myView.setBackground(ContextCompat.getDrawable(context, R.drawable.bg_accent_underlined_white));
}

次に、背景が変更される前にビューにあったパディングを設定します

myView.setPadding(padding, padding, padding, padding);
于 2016-06-16T17:01:20.300 に答える
0

多分それは誰かに関連するでしょう

セレクターでドローアブルを使用する小さなハックでパディングが削除されない

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/anything" />
</selector>
于 2022-02-27T23:04:08.397 に答える
-1

これは、cottonBallPaws の setBackgroundAndKeepPadding の改良版です。これにより、メソッドを複数回呼び出してもパディングが維持されます。

/**
 * 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.
 */
public static void setBackgroundAndKeepPadding(View view, Drawable backgroundDrawable) {

    Rect drawablePadding = new Rect();
    backgroundDrawable.getPadding(drawablePadding);

    // Add background padding to view padding and subtract any previous background padding
    Rect prevBackgroundPadding = (Rect) view.getTag(R.id.prev_background_padding);
    int left = view.getPaddingLeft() + drawablePadding.left -
            (prevBackgroundPadding == null ? 0 : prevBackgroundPadding.left);
    int top = view.getPaddingTop() + drawablePadding.top -
            (prevBackgroundPadding == null ? 0 : prevBackgroundPadding.top);
    int right = view.getPaddingRight() + drawablePadding.right -
            (prevBackgroundPadding == null ? 0 : prevBackgroundPadding.right);
    int bottom = view.getPaddingBottom() + drawablePadding.bottom -
            (prevBackgroundPadding == null ? 0 : prevBackgroundPadding.bottom);
    view.setTag(R.id.prev_background_padding, drawablePadding);

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

values/ids.xml でリソース ID を定義する必要があります。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="prev_background_padding" type="id"/>
</resources>
于 2014-04-08T14:42:50.810 に答える