Pertanyaan Ke mana perginya padding, saat mengatur latar belakang Drawable?


Saya memiliki masalah ini pada saya EditText dan Button dilihat, di mana saya memiliki padding yang bagus bagi mereka untuk ruang jauh dari teks, tetapi ketika saya mengubah latar belakang dengan setBackgroundDrawable atau setBackgroundResource padding itu hilang selamanya.


75
2018-04-10 19:32


asal


Jawaban:


Yang saya temukan adalah menambahkan 9 tambalan sebagai sumber latar belakang yang mengatur ulang padding - meskipun menarik jika saya menambahkan warna, atau gambar patch non-9, itu tidak. Solusinya adalah untuk menyimpan nilai-nilai padding sebelum latar belakang ditambahkan, kemudian mengaturnya lagi sesudahnya.

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



Saya bisa membungkus elemen di dalam tata letak lain, dalam hal ini, a FrameLayout. Yang memungkinkan saya untuk mengubah latar belakang di FrameLayout tanpa merusak padding, yang ada di dalamnya 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" 
     />
...

Pilihan lainnya adalah mengaturnya secara terprogram setelah mengatur latar belakang Drawable seperti yang disarankan di atas. Pastikan untuk menghitung piksel untuk mengoreksi resolusi perangkat.


12
2017-07-03 19:16



Belum menguji super ini secara menyeluruh, tetapi metode ini mungkin berguna:

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

Gunakan ini sebagai ganti view.setBackgroundDrawable (Drawable).


9
2018-01-24 00:08



Saya memiliki masalah ini dalam TextView, jadi saya subkelas TextView dan membuat metode Override dari TextView.setBackgroundResource(int resid) metode. Seperti ini:

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

Dengan cara ini, ia mendapatkan padding dari item sebelum mengatur sumber daya, tetapi tidak benar-benar mengacaukan fungsionalitas asli dari metode, selain menjaga padding.


9
2018-01-01 22:14



Versi kompresabel belakang dari jawaban cottonBallPaws

/** 
  * 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



Untuk pencari umum,

tambahkan saja setPadding setelah setBackgroudDrawable. Saat Anda mengubah gambar Anda, Anda harus memanggil setPadding lagi.

Seperti:

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

Cara terbersih adalah mendefinisikan paddings Anda di dalam xml-drawable yang menunjuk ke drawable-image-file

Greatings


1
2018-05-26 11:39



Solusi saya adalah memperluas pandangan (dalam kasus saya an EditText) dan menimpa setBackgroundDrawable() dan setBackgroundResource() metode:

// 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



Anda dapat memberikan beberapa padding dengan menggunakan gambar 9-tambalan dan mendefinisikan area konten di drawable. Periksa ini

Anda juga dapat mengatur padding di layout Anda dari xml atau programatically

tag bantalan xml

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

Anda dapat mencoba menyetel padding secara manual dari kode setelah Anda memanggil setBackgroundDrawable dengan memanggil setPadding di EditText atau Tampilan Tombol


0
2018-04-10 19:39



cukup ubah lib ke v7: 22.1.0 di studio android seperti ini kompilasi 'com.android.support:appcompat-v7:22.1.0'


0
2018-06-29 09:12