Lập trình được đặt bên trái có thể vẽ trong TextView


285

Tôi có một textView trong xml ở đây.

<TextView
        android:id="@+id/bookTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:drawableLeft="@drawable/checkmark"
        android:gravity="center_vertical"
        android:textStyle="bold"
        android:textSize="24dip"
        android:maxLines="1"
        android:ellipsize="end"/>

Như bạn thấy tôi đặt DrawableLeft trong xml.

Tôi muốn thay đổi drawable trong mã.

Có cách nào để đi về làm điều này? Hoặc đặt drawableLeft trong mã cho chế độ xem văn bản?

Câu trả lời:


781

Bạn có thể sử dụng setCompoundDrawablesWithIntrinsicBound (int left, int top, int right, int bottom)

đặt 0 ở nơi bạn không muốn hình ảnh

Ví dụ cho Drawable ở bên trái:

TextView textView = (TextView) findViewById(R.id.myTxtView);
textView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.icon, 0, 0, 0);

Mẹo: Bất cứ khi nào bạn biết bất kỳ thuộc tính XML nào nhưng không có manh mối về cách sử dụng nó trong thời gian chạy. chỉ cần đi đến mô tả của tài sản đó trong tài liệu phát triển. Ở đó bạn sẽ tìm thấy các Phương thức liên quan nếu nó được hỗ trợ trong thời gian chạy. tức là đối với DrawableLeft


Vì vậy, nơi tôi đặt drawable tại phương pháp này?
coder_For_Life22

1
+1 Nó hoạt động để thiết lập android: drawableLeft cho TextView theo lập trình. Thanx mate
Paresh Mayani

35
+1 để thêm tiền boa. đó phải là điều đầu tiên các nhà phát triển được nói khi sử dụng các tài liệu
gmjordan

@BrainCrash Bạn nói đúng, tôi đã nhầm nó với phương thức mới hơn có cùng tên.
deathemperor

2
Xin chào, tôi đã sử dụng phương pháp này để đặt các drawable, nhưng tôi không thể tìm thấy bộ phận getter của nó. Tôi đã phải kiểm tra xem Textview Compound có thể vẽ được không. Làm thế nào để làm điều đó? Đã thử so sánh textview.getCompoundDrawablesRelative()[0]vớimContext.getResources().getDrawable(R.drawable.my_drawable)
ravi


6

Bạn có thể sử dụng bất kỳ phương pháp nào sau đây để đặt Drawable trên TextView:

1- setCompoundDrawablesWithIntrinsicBound (int, int, int, int)

2- setCompoundDrawables (Left_Drawable, Top_Drawable, Right_Drawable, bottom_Drawable)

Và để có được rút ra từ các tài nguyên bạn có thể sử dụng:

getResources().getDrawable(R.drawable.your_drawable_id);

Không, setCompoundDrawablesWithIntrinsicBound (int, int, int, int) là API Levet 3 từ liên kết của riêng bạn ...
BrainCrash

1

Sử dụng Kotlin:

Bạn có thể tạo một chức năng mở rộng hoặc chỉ sử dụng setCompoundDrawablesWithIntrinsicBoundstrực tiếp.

fun TextView.leftDrawable(@DrawableRes id: Int = 0) {
   this.setCompoundDrawablesWithIntrinsicBounds(id, 0, 0, 0)
}

Nếu bạn cần thay đổi kích thước drawable, bạn có thể sử dụng chức năng mở rộng này.

textView.leftDrawable(R.drawable.my_icon, R.dimen.icon_size)

fun TextView.leftDrawable(@DrawableRes id: Int = 0, @DimenRes sizeRes: Int) {
    val drawable = ContextCompat.getDrawable(context, id)
    val size = resources.getDimensionPixelSize(sizeRes)
    drawable?.setBounds(0, 0, size, size)
    this.setCompoundDrawables(drawable, null, null, null)
}

Để thực sự ưa thích, hãy tạo một trình bao bọc cho phép sửa đổi kích thước và / hoặc màu sắc.

textView.leftDrawable(R.drawable.my_icon, colorRes = R.color.white)

fun TextView.leftDrawable(@DrawableRes id: Int = 0, @DimenRes sizeRes: Int = 0, @ColorInt color: Int = 0, @ColorRes colorRes: Int = 0) {
    val drawable = drawable(id)
    if (sizeRes != 0) {
        val size = resources.getDimensionPixelSize(sizeRes)
        drawable?.setBounds(0, 0, size, size)
    }
    if (color != 0) {
        drawable?.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
    } else if (colorRes != 0) {
        val colorInt = ContextCompat.getColor(context, colorRes)
        drawable?.setColorFilter(colorInt, PorterDuff.Mode.SRC_ATOP)
    }
    this.setCompoundDrawables(drawable, null, null, null)
}

0

Một phần mở rộng Kotlin + một số phần đệm xung quanh có thể vẽ được

fun TextView.addDrawable(drawable: Int) {
val imgDrawable = ContextCompat.getDrawable(context, drawable)
compoundDrawablePadding = 32
setCompoundDrawablesWithIntrinsicBounds(imgDrawable, null, null, null)
}

0

có hai cách để làm điều đó hoặc bạn có thể sử dụng XML hoặc Java cho nó. Nếu nó tĩnh và không yêu cầu thay đổi thì bạn có thể khởi tạo XML.

  android:drawableLeft="@drawable/cloud_up"
    android:drawablePadding="5sp"

Bây giờ nếu bạn cần thay đổi các biểu tượng một cách linh hoạt thì bạn có thể làm điều đó bằng cách gọi các biểu tượng dựa trên các sự kiện

       textViewContext.setText("File Uploaded");
textViewContext.setCompoundDrawablesWithIntrinsicBounds(R.drawable.uploaded, 0, 0, 0);

-8
static private Drawable **scaleDrawable**(Drawable drawable, int width, int height) {

    int wi = drawable.getIntrinsicWidth();
    int hi = drawable.getIntrinsicHeight();
    int dimDiff = Math.abs(wi - width) - Math.abs(hi - height);
    float scale = (dimDiff > 0) ? width / (float)wi : height /
            (float)hi;
    Rect bounds = new Rect(0, 0, (int)(scale * wi), (int)(scale * hi));
    drawable.setBounds(bounds);
    return drawable;
}

Điều này không trả lời câu hỏi. Câu trả lời liên quan đến TextView được mong đợi.
Rick
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.