gpt4 book ai didi

android - 如何在 Android 中为颜色创建选择器(如颜色状态列表,但用于自定义属性)?

转载 作者:行者123 更新时间:2023-11-29 01:37:56 25 4
gpt4 key购买 nike

这是我所拥有的,但没有按预期工作

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

<item custom:greyShadow="true" android:color="@color/grey_shadow"/>
<item custom:blueShadow="true" android:color="@color/blue_shadow"/>

</selector>

“greyShadow”和“blueShadow”是我的自定义属性。

我是如何尝试使用它的:

我想通过这样的样式在 View 中使用它(颜色选择器 some_color.xml):

布局:

// some_layout.xml
// the style text_input_style.xml sets a drawable as a background, that drawable uses color selector
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
custom:blueShadow="true" <!-- this is the custom attribute -->
style="@style/text_input_style" <!-- this is the style -->
/>

风格:

// text_input_style.xml
<style name="text_input_style_blue">
<item name="android:background">@drawable/some_drawable.xml</item>
</style>

可绘制:

//some_drawable.xml (used by text_input_style.xml)
<item>
<shape android:shape="rectangle" >
<solid android:color="@color/some_color"/> <!-- here, the drawable uses the color selector -->
</shape>
</item>

最佳答案

这里发生了很多问题。

首先:Android 中的标准 View (包括 EditText)都不会识别或使用您定义的自定义属性。在您的布局中,EditText 上的 custom:blueShadow="true" 行没有意义。您必须子类化 EditText,自己读取属性并应用它们。

第二:您定义的属性适用于可绘制选择器,而不适用于 View ,因此将它们应用于布局 XML 中的 View 没有意义(至少对我而言)。通常,您可以通过子类化 View 并实现 onCreateDrawableState() 来使用此类属性,然后在 View 内部状态的任何更改需要更新可绘制状态时调用 refreshDrawableState

public class CustomEditText extends EditText {
private boolean blueShadow;
private boolean greyShadow;

/* constructors omitted */

public void setBlueShadow(boolean b) {
if (blueShadow != b) {
blueShadow = b;
refreshDrawableState();
}
}

public void setGreyShadow(boolean b) {
if (greyShadow != b) {
greyShadow = b;
refreshDrawableState();
}
}

@Override
protected int[] onCreateDrawableState(int extraSpace) {
int[] baseState = super.onCreateDrawableState(extraSpace + 2);
if (blueShadow) {
mergeDrawableStates(baseState, new int[]{ R.attr.blueShadow });
}
if (greyShadow) {
mergeDrawableStates(baseState, new int[]{ R.attr.greyShadow });
}
}
}

这里有一个关于自定义可绘制状态如何工作的很好的指南:Charles Harley - Custom drawable states in Android .

关于android - 如何在 Android 中为颜色创建选择器(如颜色状态列表,但用于自定义属性)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26685387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com