gpt4 book ai didi

android - 如何添加自定义按钮状态

转载 作者:IT老高 更新时间:2023-10-28 13:00:34 25 4
gpt4 key购买 nike

例如,默认按钮在其状态和背景图像之间具有以下依赖关系:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_window_focused="false" android:state_enabled="true"
android:drawable="@drawable/btn_default_normal" />
<item android:state_window_focused="false" android:state_enabled="false"
android:drawable="@drawable/btn_default_normal_disable" />
<item android:state_pressed="true"
android:drawable="@drawable/btn_default_pressed" />
<item android:state_focused="true" android:state_enabled="true"
android:drawable="@drawable/btn_default_selected" />
<item android:state_enabled="true"
android:drawable="@drawable/btn_default_normal" />
<item android:state_focused="true"
android:drawable="@drawable/btn_default_normal_disable_focused" />
<item
android:drawable="@drawable/btn_default_normal_disable" />
</selector>

如何定义自己的自定义状态(类似于 android:state_custom),然后我可以使用它来动态更改按钮的视觉外观?

最佳答案

@(Ted Hopp) 指出的解决方案可行,但需要稍作修正:在选择器中,项目状态需要一个“app:”前缀,否则充气器将无法正确识别命名空间,并且会静默失败;至少这是发生在我身上的事情。

请允许我在这里报告整个解决方案,并提供更多详细信息:

首先,创建文件“res/values/attrs.xml”:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="food">
<attr name="state_fried" format="boolean" />
<attr name="state_baked" format="boolean" />
</declare-styleable>
</resources>

然后定义您的自定义类。例如,它可能是从类“Button”派生的类“FoodButton”。您将必须实现一个构造函数;实现这个,这似乎是充气机使用的:

public FoodButton(Context context, AttributeSet attrs) {
super(context, attrs);
}

在派生类之上:

private static final int[] STATE_FRIED = {R.attr.state_fried};
private static final int[] STATE_BAKED = {R.attr.state_baked};

还有,你的状态变量:

private boolean mIsFried = false;
private boolean mIsBaked = false;

还有几个二传手:

public void setFried(boolean isFried) {mIsFried = isFried;}
public void setBaked(boolean isBaked) {mIsBaked = isBaked;}

然后重写函数“onCreateDrawableState”:

@Override
protected int[] onCreateDrawableState(int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 2);
if (mIsFried) {
mergeDrawableStates(drawableState, STATE_FRIED);
}
if (mIsBaked) {
mergeDrawableStates(drawableState, STATE_BAKED);
}
return drawableState;
}

最后,这个难题中最微妙的部分;定义将用作小部件背景的 StateListDrawable 的选择器。这是文件“res/drawable/food_button.xml”:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.mydomain.mypackage">
<item
app:state_baked="true"
app:state_fried="false"
android:drawable="@drawable/item_baked" />
<item
app:state_baked="false"
app:state_fried="true"
android:drawable="@drawable/item_fried" />
<item
app:state_baked="true"
app:state_fried="true"
android:drawable="@drawable/item_overcooked" />
<item
app:state_baked="false"
app:state_fried="false"
android:drawable="@drawable/item_raw" />
</selector>

注意“app:”前缀,而对于标准的 android 状态,您会使用前缀“android:”。 XML 命名空间对于 inflater 的正确解释至关重要,并且取决于您要在其中添加属性的项目类型。如果是应用程序,请将 com.mydomain.mypackage 替换为您的应用程序的实际包名称(应用程序名称除外)。如果它是一个库,则必须使用“http://schemas.android.com/apk/res-auto”(并且使用的是 R17 或更高版本的工具),否则会出现运行时错误。

几点说明:

  • 看来您不需要调用“refreshDrawableState”函数,至少在我的情况下解决方案效果很好

  • 为了在布局 xml 文件中使用您的自定义类,您必须指定完全限定名称(例如 com.mydomain.mypackage.FoodButton)

  • 您可以将标准状态(例如 android:pressed、android:enabled、android:selected)与自定义状态混合,以表示更复杂的状态组合

关于android - 如何添加自定义按钮状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4336060/

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