android: drawableLeft margin dan / atau padding

383

Apakah mungkin untuk mengatur margin atau padding untuk gambar yang kami tambahkan dengan android:drawableLeft?

androidNewbies
sumber

Jawaban:

466

Seperti cephus yang disebutkan android:drawablePaddinghanya akan memaksa padding antara teks dan drawable jika tombolnya cukup kecil.

Saat meletakkan tombol yang lebih besar, Anda dapat menggunakan android:drawablePaddingbersama dengan android:paddingLeftdan android:paddingRightuntuk memaksa teks dan digeser ke dalam ke arah tengah tombol. Dengan menyesuaikan padding kiri dan kanan secara terpisah, Anda dapat membuat penyesuaian yang sangat rinci pada tata letak.

Berikut adalah contoh tombol yang menggunakan padding untuk mendorong teks dan ikon lebih dekat bersama daripada yang seharusnya:

<Button android:text="@string/button_label" 
    android:id="@+id/buttonId"
    android:layout_width="160dip"
    android:layout_height="60dip"
    android:layout_gravity="center"
    android:textSize="13dip"
    android:drawableLeft="@drawable/button_icon"
    android:drawablePadding="2dip"
    android:paddingLeft="30dip"
    android:paddingRight="26dip"
    android:singleLine="true"
    android:gravity="center" />  
Yordania
sumber
22
android: paddingLeft = "30dip" android: paddingRight = "26dip" adalah kunci di sini!
IgorGanapolsky
4
ini tidak terkait dengan pertanyaan, tetapi android: gravity = "center" akan menjaga teks tetap selaras dengan pusat gambar yang dapat digambar!
cwhsu
1
Bagaimana jika kita memiliki drawable di kiri dan kanan, dan hanya perlu menyesuaikan drawable yang tepat ??
nmxprime
Saya hanya menggunakan: android: paddingLeft, dan itu mengubah posisi gambar. android: drawablePadding digunakan untuk ruang antara gambar dan teks.
Berani
Masalah kode ini adalah hal ini menyebabkan passwordToggleDrawablegap padding kiri menjadi lebih besar karena tidak dapat menargetkan spesifik untuk dibiarkan saja.
Buah
184

TextView memiliki properti android: drawablePadding yang dapat melakukan trik:

android: drawablePadding

Padding antara drawables dan teks.

Harus berupa nilai dimensi, yang merupakan angka titik apung yang ditambahkan dengan unit seperti "14.5sp". Unit yang tersedia adalah: px (piksel), dp (piksel bebas-kepadatan), sp (piksel berskala berdasarkan ukuran font yang disukai), dalam (inci), mm (milimeter).

Ini juga bisa menjadi referensi ke sumber daya (dalam bentuk "@ [paket:] ketik: nama") atau atribut tema (dalam bentuk "? [Paket:] [jenis:] nama") yang berisi nilai dari jenis ini .

Ini sesuai dengan simbol sumber daya atribut global drawablePadding.

Cheryl Simon
sumber
61

android:drawablePaddinghanya akan membuat celah bantalan antara teks dan gambar jika tombolnya cukup kecil untuk menyatukan 2. Jika tombol Anda lebih lebar dari lebar gabungan (untuk drawableLeft / drawableRight) atau tinggi (untuk drawableTop / drawableBottom) maka drawablePadding tidak melakukan apa-apa.

Saya sedang berjuang dengan ini sekarang juga. Tombol saya cukup lebar, dan ikon tergantung di tepi kiri tombol dan teks dipusatkan di tengah. Satu-satunya cara saya untuk mengatasi ini untuk saat ini adalah memanggang margin pada gambar dengan menambahkan piksel kosong ke tepi kiri kanvas dengan photoshop. Tidak ideal, dan juga tidak benar-benar direkomendasikan. Tapi itu solusi stop-gap saya untuk saat ini, singkat membangun kembali TextView / Button.

cephus
sumber
terima kasih telah menjelaskan masalah saya. Saya belum menyadari bahwa ini disebabkan hanya ketika tombolnya cukup lebar
peter.bartos
Saya memiliki masalah yang sama. Tombol saya lebar sehingga gambarnya tidak dekat dengan teks
Milad Faridnia
yay itu bekerja berkat
dave o Grady
43

Iya. gunakan drawablePadding sebagai berikut,

<TextView
        android:id="@+id/tvHeader"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Settings and Contents"
        android:drawableLeft="@drawable/icon_success"
        android:drawablePadding="10dp" />
Parinda Rajapaksha
sumber
37

Buat sumber daya yang dapat ditarik.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true">
        <inset android:drawable="@drawable/small_m" android:insetLeft="10dp" android:insetTop="10dp" />
    </item>
    <item>
        <inset android:drawable="@drawable/small_p" android:insetLeft="10dp" android:insetTop="10dp" />
    </item>
</selector>
Artis Terbaik
sumber
2
@ Artis Terbaik Saya telah menggunakan inset di drawable dan berfungsi dengan baik untuk perangkat versi yang lebih baru. Maksud saya ini tidak bekerja di SDK 16, 17 tetapi bekerja di SDK 23. Apakah ada ide?
Bhavin Chauhan
Jawaban dan upvote bagus untuk ini. Anda hanya membantu saya memecahkan masalah yang membingungkan saya untuk waktu yang lama.
Anthonyeef
34

android:drawablePaddingadalah cara termudah untuk memberikan padding ke ikon drawable tetapi Anda tidak dapat memberikan padding satu sisi seperti paddingRightatau paddingLeftdari drawable icon. Untuk mencapai itu Anda harus menggali ke dalamnya. Dan Jika Anda menerapkan paddingLeftatau paddingRightuntuk Edittextitu akan menempatkan padding ke seluruh Edittextbersama dengan ikon yang dapat ditarik.

Bhargav Thanki
sumber
12

tentukan bentuk untuk edittext Anda dan berikan padding Sebagai Contoh

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >
    <padding
        android:left="5dp"
        android:right="5dp"
    />
    <solid android:color="#F6F6F6" />
    <stroke
        android:width="1px"
        android:color="#C3C3C3" />

    <corners
        android:bottomLeftRadius="1dp"
        android:bottomRightRadius="1dp"
        android:topLeftRadius="1dp"
        android:topRightRadius="1dp" />
</shape>

Padding yang didefinisikan dalam bentuk ini akan membantu memberikan padding untuk draweleleft atau kanan ---------------------- Terapkan bentuk ini pada EditView

 <EditText
            android:id="@+id/example"
            android:layout_width="fill_parent"
            android:layout_height="36dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:background="@drawable/shape2"
            android:drawableLeft="@drawable/icon1"
            android:drawablePadding="@dimen/txtDrwblPadding"
            android:ems="10"
         />

menggunakan bentuk yang didefinisikan sebagai latar belakang akan memberikan EditText Anda beberapa gaya plus margin ke drawableLeft.

Umesh N
sumber
12

android: drawablePadding adalah cara termudah untuk memberikan padding ke ikon drawable tetapi Anda tidak dapat memberikan padding satu sisi tertentu seperti paddingRight atau paddingLeft dari ikon drawable. Untuk mencapai itu Anda harus menggali ke dalamnya. Dan Jika Anda menerapkan paddingLeft atau paddingRight ke Edittext maka itu akan menempatkan padding ke seluruh Edittext bersama dengan ikon yang dapat digambar.

<TextView android:layout_width="match_parent"
    android:padding="5sp"
    android:id="@+id/date"
    android:gravity="center|start"
    android:drawableEnd="@drawable/ic_calendar"
    android:background="@drawable/edit_background"
    android:hint="Not Selected"
    android:drawablePadding="10sp"
    android:paddingStart="10sp"
    android:paddingEnd="10sp"
    android:textColor="@color/black"
    android:layout_height="wrap_content"/>
Sekhon123
sumber
Anda harus menggunakan "dp"
Mark Pazon
11
<TextView
    android:layout_width="wrap_content"
    android:layout_height="32dp"
    android:background="@drawable/a"
    android:drawableLeft="@drawable/concern_black"
    android:gravity="center"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:drawablePadding="10dp"
    android:text="text"/>

catatan: layout_width perlu wrap_content dan gunakan paddingLeft paddingRight drawablePadding untuk mengontrol celah. Jika Anda menentukan nilai layout_width akan memiliki kesenjangan antara ikon dan teks, saya pikir sekali memberikan nilai menentukan layout_width, padding akan mengukur.

王良海
sumber
9

Saya akan melemparkan jawaban saya ke atas ring juga. Jika Anda ingin melakukan ini secara terprogram Anda dapat melakukan hal berikut.

final Drawable drawable = ContextCompat.getDrawable(getContext(), R.drawable.somedrawable);
final boolean isLTR = ViewCompat.LAYOUT_DIRECTION_LTR == ViewCompat.getLayoutDirection(this);
final int iconInsetPadding = getResources().getDimensionPixelSize(R.dimen.icon_padding);

final Drawable insetDrawable = new InsetDrawable(drawable, isLTR ? 0 : iconInsetPadding, 0, isLTR ? iconInsetPadding : 0, 0);

Ini akan menambahkan padding ke ujung drawable di mana end akan berarti kiri / kanan tergantung apakah ponsel di LTR atau RTL.

Daniel Ochoa
sumber
7

Alih-alih Buttondigunakan LinearLayoutdengan ImageViewdan TextViewdi dalam. Dalam item anak suka ImageViewdan TextViewgunakan android:duplicateParentState="true".

Alexey Zakharov
sumber
Anda benar-benar membutuhkan FrameLayout dan Button (dan ImageView / TextView di dalam LinearLayout mereka sendiri) untuk mereproduksi UI Tombol dan mentransfer onclicklistener () ke bagian tombol
3c71
1
Mengapa menggunakan tata letak tambahan jika Anda sudah memiliki drawablePadding di TextView.
Parinda Rajapaksha
5

Anda harus mempertimbangkan menggunakan daftar lapisan

Buat file yang dapat digambar seperti ini, beri nama ic_calendar.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape android:shape="rectangle">
        <solid android:color="@android:color/transparent"/>
    </shape>
</item>
<item android:right="10dp">
    <bitmap android:gravity="center_vertical|left"
        android:src="@drawable/ic_calendar_16dp"
        android:tint="@color/red"
        />
</item>
</layer-list>

Di bawah file tata letak,

<TextView
         android:id="@+id/tvDate"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:drawableLeft="@drawable/ic_calendar"
         android:textColor="@color/colorGrey"
         android:textSize="14sp" 
    />
RayChongJH
sumber
4

Anda dapat menggunakan padding untuk tombol dan Anda bisa bermain dengan DrawablePadding

 <Button
    style="@style/botonesMenu"
    android:padding="15dp"
    android:drawablePadding="-15dp"
    android:text="@string/actualizarBD"
    android:textAlignment="gravity"
    android:gravity="center"
    android:layout_row="1"
    android:layout_column="0"
    android:drawableTop="@drawable/actualizar"
    android:id="@+id/btnActualizar"
    android:onClick="actualizarBD" />

Anda dapat menggunakan padding tertentu tergantung tempat meletakkan drawable Anda, dengan android: paddingLeft = "10dp" atau android: paddingBottom = "10dp" atau android: paddingRight = "10dp" atau android: paddingTop = "10dp"

Carolina
sumber
2

Anda dapat menggunakan android:drawableLeft="@drawable/your_icon"untuk mengatur gambar yang akan ditampilkan di sisi kiri. Untuk mengatur padding untuk drawable, Anda harus menggunakan android:paddingLeftatau android:paddingRightuntuk mengatur padding kiri / kanan masing-masing.

android:paddingRight="10dp"
android:paddingLeft="20dp"
android:drawableRight="@drawable/ic_app_manager"
AouledIssa
sumber
1

Jika ukuran sumber daya yang dapat ditarik diperbaiki, Anda dapat melakukan hal ini:

<Button
    android:background="@drawable/rounded_button_green"
    style="?android:attr/selectableItemBackground"
    android:layout_height="wrap_content"
    app:layout_widthPercent="70%"
    android:drawableRight="@drawable/ic_clear_black_24dp"
    android:paddingRight="10dp"
    android:paddingLeft="34dp"
    tools:text="example" />

Kuncinya di sini adalah:

    android:drawableRight="@drawable/ic_clear_black_24dp"
    android:paddingRight="10dp"
    android:paddingLeft="34dp"

Artinya, ukuran sumber daya yang dapat ditarik plus paddingRight adalah paddingLeft.

Anda dapat melihat hasilnya dalam contoh ini

pengguna3344964
sumber
1
textView.setCompoundDrawablesWithIntrinsicBounds(AppCompatResources.getDrawable(this,drawable),null,null,null);

addressTitleView.setCompoundDrawablePadding();
Srinivas Kokkula
sumber
Sementara potongan kode ini dapat menyelesaikan pertanyaan, termasuk penjelasan sangat membantu untuk meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, dan orang-orang itu mungkin tidak tahu alasan untuk saran kode Anda.
Rosário Pereira Fernandes
Ini hanya berfungsi untuk tampilan teks bukan tombol misalnya yang juga memungkinkan untuk mengatur mulai / mengakhiri drwables
Ixx
1

baru saja membuat ulang dari:

<?xml version="1.0" encoding="utf-8"?>
<shape
        xmlns:android="http://schemas.android.com/apk/res/android">

    <corners android:radius="40dp"/>

    <solid android:color="@android:color/white"/>

</shape>

untuk

<layer-list
        xmlns:android="http://schemas.android.com/apk/res/android">
    <item
            android:right="@dimen/_2dp"
            android:left="@dimen/_2dp"
            android:bottom="@dimen/_2dp"
            android:top="@dimen/_2dp"
            >
        <shape
                xmlns:android="http://schemas.android.com/apk/res/android">

            <corners android:radius="40dp"/>

            <solid android:color="@android:color/white"/>

        </shape>
    </item>

</layer-list>
nicolas asinovich
sumber
-6

Mencoba menggunakan lapisan negatif

Suka:

android:paddingLeft="-8dp"
Philipe Steiff
sumber