티스토리 뷰
Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.
Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.
아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.
Programmatically set left drawable in a TextView
텍스트뷰에 왼쪽 드로어블을 프로그래밍 방식으로 설정하기
문제 내용
I have a textView in xml here.
여기에 xml 파일에 있는 textView가 있습니다.
<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"/>
As you can see I set the DrawableLeft in xml.
보시다시피 xml에서 DrawableLeft를 설정했습니다.
I would like to change the drawable in code.
코드에서 Drawable을 변경하고 싶습니다.
Is there anyway to go about doing this? Or setting the drawableLeft in code for the text view?
이것을 하는 방법이 있을까요? 또는 텍스트 뷰에서 drawableLeft를 코드로 설정하는 방법이 있을까요?
높은 점수를 받은 Solution
You can use setCompoundDrawablesWithIntrinsicBounds(int left, int top, int right, int bottom)
setCompoundDrawablesWithIntrinsicBounds(int left, int top, int right, int bottom)를 사용할 수 있습니다.
set 0 where you don't want images
이미지를 원하지 않는 곳은 0을 설정하세요.
Example for Drawable on the left:
왼쪽에 Drawable을 놓는 예제:
TextView textView = (TextView) findViewById(R.id.myTxtView);
textView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.icon, 0, 0, 0);
Alternatively, you can use setCompoundDrawablesRelativeWithIntrinsicBounds to respect RTL/LTR layouts.
대안으로, RTL / LTR 레이아웃을 고려하여 setCompoundDrawablesRelativeWithIntrinsicBounds를 사용할 수 있습니다.
Tip: Whenever you know any XML attribute but don't have clue about how to use it at runtime. just go to the description of that property in developer doc. There you will find Related Methods if it's supported at runtime . i.e. For DrawableLeft
팁: XML 속성을 알고 있지만 런타임에서 어떻게 사용해야 할지 모를 때는 해당 속성 설명서로 이동하십시오. 런타임에서 지원되는 경우 관련 메서드가 있습니다. 즉, DrawableLeft의 경우 관련 메서드를 찾을 수 있습니다.
가장 최근 달린 Solution
Using Kotlin:
Kotlin을 사용하는 경우:
You can create an extension function or just use setCompoundDrawablesWithIntrinsicBounds
directly.
Kotlin을 사용하면, setCompoundDrawablesWithIntrinsicBounds를 직접 사용하거나 확장 함수를 생성해서 사용할 수 있습니다.
fun TextView.leftDrawable(@DrawableRes id: Int = 0) {
this.setCompoundDrawablesWithIntrinsicBounds(id, 0, 0, 0)
}
If you need to resize the drawable, you can use this extension function.
만약 드로어블 크기를 조정해야 하는 경우에는 이 확장 함수를 사용할 수 있습니다.
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)
}
To get really fancy, create a wrapper that allows size and/or color modification.
더욱 고급진 방법으로는, 크기와/또는 색상 수정이 가능한 래퍼(wrapper)를 생성하는 것입니다.
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)
}
출처 : https://stackoverflow.com/questions/6931900/programmatically-set-left-drawable-in-a-textview
'개발 > 안드로이드' 카테고리의 다른 글
Fragment에서 inflate 중 "Duplicate ID, tag null, or parent id with another fragment" 오류 수정하기 (0) | 2023.01.25 |
---|---|
Gradle에서 transitive = true의 동작 방식 (0) | 2023.01.24 |
RecyclerView에서 WRAP_CONTENT 동작 오류 수정하기 (0) | 2023.01.23 |
LinearLayout에서 차일드 뷰들 사이에 프로그래밍 방식으로 패딩 주기 (0) | 2023.01.22 |
APK 파일에서 AndroidManifest.xml을 보기 (0) | 2023.01.20 |