참조일 때 프로그래밍 방식으로 색상 값 가져오기(테마)
고려 사항:
styles.xml
<style name="BlueTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="theme_color">@color/theme_color_blue</item>
</style>
attrs.xml
<attr name="theme_color" format="reference" />
color.xml
<color name="theme_color_blue">#ff0071d3</color>
그래서 테마 색상은 테마에 의해 참조됩니다.어떻게 하면 프로그래밍 방식으로 theme_color(참조)를 얻을 수 있습니까?일반적으로 사용합니다.getResources().getColor()
하지만 이 경우에는 참조되었기 때문에 아닙니다!
이 작업을 수행해야 합니다.
TypedValue typedValue = new TypedValue();
Theme theme = context.getTheme();
theme.resolveAttribute(R.attr.theme_color, typedValue, true);
@ColorInt int color = typedValue.data;
또한 이 코드를 호출하기 전에 테마를 활동에 적용해야 합니다.다음 중 하나를 선택합니다.
android:theme="@style/Theme.BlueTheme"
당신의 매니페스트 또는 콜에서 (당신이 전화하기 전에).setContentView(int)
):
setTheme(R.style.Theme_BlueTheme)
에onCreate()
.
저는 당신의 가치관으로 테스트를 해보았고 완벽하게 작동했습니다.
재료 설계 라이브러리에서 제공하는 유틸리티 클래스를 사용할 수 있습니다.
int color = MaterialColors.getColor(context, R.attr.theme_color, Color.BLACK)
참고:Color.BLACK
속성이 u에 제공되는 경우 기본 색상입니다.
코틀린을 사용하는 경우 허용된 답변에 추가합니다.
@ColorInt
fun Context.getColorFromAttr(
@AttrRes attrColor: Int,
typedValue: TypedValue = TypedValue(),
resolveRefs: Boolean = true
): Int {
theme.resolveAttribute(attrColor, typedValue, resolveRefs)
return typedValue.data
}
그리고 나서 당신의 활동에서 당신은 할 수 있습니다.
textView.setTextColor(getColorFromAttr(R.attr.color))
2021/January/8
테마 속성에서 색상을 가져오려면 다음 단계를 수행합니다.
변수 my_color를 만들고 테마 속성의 색상을 다음과 같이 저장합니다.
val my_color = MaterialColors.getColor(<VIEWOBJECT>, R.attr.<YOUATRRIBUTENAME>)
대신에<VIEWOBJECT>
색상을 사용할 뷰 객체를 전달합니다(배후에서 컨텍스트를 얻는 데만 사용됨).<VIEWOBJECT>.getContext()
리소스(즉, 테마 속성 값)에 액세스할 수 있습니다.대신에<YOURATTRIBUTENAME>
액세스할 속성의 이름 사용
예 1:
특정 활동에서 테마 속성으로 색상을 참조하려면 다음과 같이 하십시오.색상을 사용할 뷰 객체를 나타내는 변수를 만듭니다.여기에 텍스트가 있습니다. 활동에서 보기, 내부의 개체를 참조합니다.textview
변수를 지정하여 다음으로 전달합니다.getColor
메소드와 배경 뒤에서는 해당 개체를 사용하여 컨텍스트를 가져와 테마 속성 값에 액세스할 수 있습니다.
val textview: TextView = findViewById(R.id.mytextview)
val my_color = MaterialColors.getColor(textView, R.attr<YOURATTRIBUTENAME>)
예 2:
사용자 정의 뷰 내의 테마 속성에서 색상을 가져오려면 다음을 사용하십시오.
val my_color = MaterialColors.getColor(this, R.attr.<YOUATRRIBUTENAME>)
사용자 정의 보기 내부this
사용자 지정 보기의 개체를 말하며, 실제로는 보기 개체입니다.
이것은 저에게 효과가 있었습니다.
int[] attrs = {R.attr.my_attribute};
TypedArray ta = context.obtainStyledAttributes(attrs);
int color = ta.getResourceId(0, android.R.color.black);
ta.recycle();
16진수 문자열을 제거하려면 다음을 수행합니다.
Integer.toHexString(color)
build.gradle(앱)에 추가합니다.
implementation 'androidx.core:core-ktx:1.1.0'
코드 어딘가에 이 확장 기능을 추가합니다.
import androidx.core.content.res.use
@ColorInt
@SuppressLint("Recycle")
fun Context.themeColor(
@AttrRes themeAttrId: Int
): Int {
return obtainStyledAttributes(
intArrayOf(themeAttrId)
).use {
it.getColor(0, Color.MAGENTA)
}
}
이 코틀린 확장자를 사용합니다.
@ColorInt
fun Context.getColorFromAttr( @AttrRes attrColor: Int
): Int {
val typedArray = theme.obtainStyledAttributes(intArrayOf(attrColor))
val textColor = typedArray.getColor(0, 0)
typedArray.recycle()
return textColor
}
견본을 만들다
getColorFromAttr(android.R.attr.textColorSecondary)
여러 색상을 원하는 경우 다음을 사용할 수 있습니다.
int[] attrs = {R.attr.customAttr, android.R.attr.textColorSecondary,
android.R.attr.textColorPrimaryInverse};
Resources.Theme theme = context.getTheme();
TypedArray ta = theme.obtainStyledAttributes(attrs);
int[] colors = new int[attrs.length];
for (int i = 0; i < attrs.length; i++) {
colors[i] = ta.getColor(i, 0);
}
ta.recycle();
도면에 대한 참조를 찾고 있는 사용자는 다음을 사용해야 합니다.false
resolveRefs
theme.resolveAttribute(R.attr.some_drawable, typedValue, **false**);
여러 속성을 사용하고 색상 정수 배열을 반환하는 간결한 Java 유틸리티 방법이 있습니다.:)
/**
* @param context Pass the activity context, not the application context
* @param attrFields The attribute references to be resolved
* @return int array of color values
*/
@ColorInt
static int[] getColorsFromAttrs(Context context, @AttrRes int... attrFields) {
int length = attrFields.length;
Resources.Theme theme = context.getTheme();
TypedValue typedValue = new TypedValue();
@ColorInt int[] colorValues = new int[length];
for (int i = 0; i < length; ++i) {
@AttrRes int attr = attrFields[i];
theme.resolveAttribute(attr, typedValue, true);
colorValues[i] = typedValue.data;
}
return colorValues;
}
나에게는 오직 다음과 같은 것만 작동했습니다.ContextCompat
리고그고.typedValue.resourceId
이 질문에서 제안된 바와 같이:프로그래밍 방식으로 색상 속성 값을 가져오는 방법
TypedValue typedValue = new TypedValue();
getTheme().resolveAttribute(R.attr.colorControlNormal, typedValue, true);
int color = ContextCompat.getColor(this, typedValue.resourceId)
언급URL : https://stackoverflow.com/questions/17277618/get-color-value-programmatically-when-its-a-reference-theme
'programing' 카테고리의 다른 글
비활동 클래스(LocationManager)에서 getSystemService를 사용하려면 어떻게 해야 합니까? (0) | 2023.08.27 |
---|---|
Facebook 팬 이름 검색 (0) | 2023.08.27 |
페이지 로드 시 Twitter 부트스트랩 회전 장치가 자동으로 미끄러지지 않도록 방지 (0) | 2023.08.27 |
Jquery agaxStart가 트리거되지 않음 (0) | 2023.08.27 |
2열 div 레이아웃: 고정 너비의 오른쪽 열, 왼쪽 유체 (0) | 2023.08.27 |