android: drawableLeft lề và / hoặc padding


Câu trả lời:


465

Như cephus đã đề cập android:drawablePaddingsẽ chỉ buộc đệm giữa văn bản và drawable nếu nút đủ nhỏ.

Khi bố trí các nút lớn hơn, bạn có thể sử dụng android:drawablePaddingkết hợp với android:paddingLeftandroid:paddingRightđể buộc văn bản và có thể vẽ vào bên trong về phía giữa của nút. Bằng cách điều chỉnh riêng phần đệm bên trái và bên phải, bạn có thể điều chỉnh rất chi tiết cho bố cục.

Đây là một nút ví dụ sử dụng phần đệm để đẩy văn bản và biểu tượng gần nhau hơn so với mặc định:

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

21
android: paddingLeft = "30dip" android: paddingRight = "26dip" là chìa khóa ở đây!
IgorGanapolsky

4
Điều này không liên quan đến câu hỏi, nhưng android: vity = "centre" sẽ giữ cho văn bản được căn chỉnh với tâm của drawable!
cwhsu

1
Điều gì sẽ xảy ra nếu chúng ta có các ngăn kéo ở cả bên trái và bên phải, và chỉ phải điều chỉnh bên phải có thể rút được ??
nmxprime

Tôi chỉ sử dụng: android: paddingLeft và nó thay đổi vị trí của hình ảnh. android: drawablePadding được sử dụng cho không gian giữa hình ảnh và văn bản.
Dũng cảm

Vấn đề của mã này là nó làm cho passwordToggleDrawablekhoảng cách đệm bên trái trở nên lớn hơn vì nó không thể chỉ nhắm mục tiêu cụ thể vào bên trái.
Trái cây

184

TextView có một thuộc tính android: drawablePadding nên thực hiện thủ thuật:

android: drawablePadding

Phần đệm giữa các drawable và văn bản.

Phải là giá trị thứ nguyên, là số dấu phẩy động được gắn với một đơn vị, chẳng hạn như "14,5sp". Các đơn vị khả dụng là: px (pixel), dp (pixel độc lập với mật độ), sp (pixel được chia tỷ lệ dựa trên kích thước phông chữ ưa thích), tính bằng (inch), mm (milimet).

Đây cũng có thể là một tham chiếu đến một tài nguyên (ở dạng "@ [gói:] type: name") hoặc thuộc tính theme (ở dạng "? [Gói:] [type:] name") chứa giá trị của loại này .

Điều này tương ứng với biểu tượng tài nguyên thuộc tính toàn cầu drawablePadding.


61

android:drawablePaddingsẽ chỉ tạo một khoảng cách đệm giữa văn bản và có thể vẽ được nếu nút đủ nhỏ để ghép 2 cái lại với nhau. Nếu nút của bạn rộng hơn chiều rộng kết hợp (đối với drawableLeft / drawableRight) hoặc height (đối với drawableTop / drawableBottom) thì drawablePadding sẽ không làm gì cả.

Tôi đang vật lộn với điều này ngay bây giờ là tốt. Các nút của tôi khá rộng và biểu tượng được treo ở cạnh trái của nút và văn bản được đặt ở giữa. Cách duy nhất của tôi để giải quyết vấn đề này bây giờ là nướng trong lề trên có thể vẽ bằng cách thêm các pixel trống vào cạnh trái của khung vẽ bằng photoshop. Không lý tưởng, và cũng không thực sự được đề nghị. Nhưng đó là giải pháp ngăn chặn của tôi bây giờ, không xây dựng lại TextView / Nút.


cảm ơn vì đã giải thích vấn đề của tôi Tôi đã không nhận ra rằng nó chỉ được gây ra khi nút đủ rộng
peter.bartos

Tôi có cùng một vấn đề. Nút của tôi rộng nên có thể vẽ không gần với văn bản
Milad Faridnia 27/11/18

yay nó hoạt động cảm ơn
dave o grady

43

Đúng. sử dụng drawablePadding như sau,

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

37

Tạo tài nguyên có thể vẽ của bạn

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

2
@ The Finest Artist Tôi đã sử dụng inet in drawable và nó hoạt động tốt cho các thiết bị phiên bản mới hơn. Ý tôi là nó không hoạt động trong SDK 16, 17 nhưng hoạt động trong SDK 23. Có ý tưởng nào không?
Bhavin Chauhan


Câu trả lời tốt đẹp và upvote cho điều này. Bạn chỉ giúp tôi giải quyết một vấn đề khiến tôi bối rối trong một thời gian dài.
Anthonyeef

34

android:drawablePaddinglà cách dễ nhất để cung cấp phần đệm cho biểu tượng có thể vẽ được nhưng Bạn không thể cung cấp phần đệm cụ thể như paddingRighthoặc biểu tượng có thể paddingLeftvẽ được. Để đạt được điều đó bạn phải đào sâu vào nó. Và Nếu bạn áp dụng paddingLefthoặc paddingRightđể Edittextsau đó nó sẽ đặt đệm cho toàn bộ Edittextcùng với biểu tượng drawable.


12

xác định hình dạng cho edittext của bạn và cung cấp cho nó một ví dụ

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

Phần đệm được xác định trong hình này sẽ giúp tạo phần đệm cho drawableeleft hoặc phải ---------------------- Áp dụng hình dạng này trên 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"
         />

sử dụng hình dạng được xác định đó làm nền sẽ cung cấp cho EditText của bạn một số kiểu cộng với lề cho drawableLeft.


12

android: drawablePadding là cách dễ nhất để cung cấp phần đệm cho biểu tượng có thể vẽ được nhưng bạn không thể cung cấp phần đệm cụ thể như paddingRight hoặc phần đệm Biểu tượng có thể vẽ được. Để đạt được điều đó, bạn phải tìm hiểu kỹ về nó. Và nếu bạn áp dụng paddingLeft hoặc paddingRight cho Edittext thì nó sẽ đặt padding vào toàn bộ Edittext cùng với biểu tượng drawable.

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

Bạn nên sử dụng "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"/>

lưu ý: layout_creen cần phải được quấn_content và sử dụng paddingLeft paddingRight drawablePadding để kiểm soát khoảng cách. Nếu bạn chỉ định giá trị layout_ thong sẽ có khoảng cách giữa biểu tượng và văn bản, tôi nghĩ rằng một khi cung cấp cho layout_creen một giá trị chỉ định, phần đệm sẽ đo.


9

Tôi cũng sẽ ném câu trả lời của mình vào vòng. Nếu bạn muốn làm điều này theo chương trình, bạn có thể làm như sau.

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

Điều này sẽ thêm phần đệm vào phần cuối của drawable trong đó phần cuối sẽ có nghĩa là trái / phải tùy thuộc vào việc điện thoại nằm trong LTR hay RTL.


7

Thay vì Buttonsử dụng LinearLayoutvới ImageViewTextViewbên trong. Trong các mặt hàng trẻ em thích ImageViewTextViewsử dụng android:duplicateParentState="true".


Bạn thực sự sẽ cần FrameLayout và Nút (và ImageView / TextView bên trong linearLayout của riêng họ) để tạo lại UI UI và chuyển onclicklistener () sang phần nút
3c71 21/03

1
Tại sao sử dụng bố cục bổ sung nếu bạn đã có drawablePadding trong TextView.
Parinda Rajapaksha

5

Bạn nên xem xét sử dụng danh sách lớp

Tạo một tệp có thể vẽ được như thế này, đặt tên là ic_calWiki.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>

Theo tập tin bố trí,

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

4

Bạn có thể sử dụng phần đệm cho nút và bạn có thể chơi với 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" />

bạn có thể sử dụng một phần đệm cụ thể tùy thuộc vào vị trí có thể vẽ của bạn, với android: paddingLeft = "10dp" hoặc android: paddingBottom = "10dp" hoặc android: paddingRight = "10dp" hoặc android: paddingTop = "10dp"


2

Bạn có thể sử dụng android:drawableLeft="@drawable/your_icon"để đặt drawable được hiển thị ở phía bên trái. Để đặt phần đệm cho phần có thể vẽ, bạn nên sử dụng android:paddingLefthoặc android:paddingRightđể đặt phần đệm bên trái / bên phải.

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

1

Nếu kích thước của resouce có thể rút được là cố định, bạn có thể làm như thế này:

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

Chìa khóa ở đây là:

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

Đó là, kích thước của tài nguyên có thể rút được cộng với paddingRight là paddingLeft.

Bạn có thể thấy kết quả trong ví dụ này


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

addressTitleView.setCompoundDrawablePadding();

Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn.
Rosário Pereira Fernandes

Nút này chỉ hoạt động cho chế độ xem văn bản chứ không phải nút cũng cho phép đặt drwables start / end
Ixx

1

chỉ cần làm lại từ:

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

đến

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.