我创建了一个自定义按钮类(我遵循了这个主题:http://developer.android.com/training/custom-views/create-view.html)
现在我想创建一个自定义状态 (state_avability),我创建了一个新的属性 attrs.xml :
<declare-styleable name="CustomButton">
<attr name="state_available" format="boolean" />
</declare-styleable>
我想用
StateListDrawable mNormalDrawable;
mNormalDrawable = new StateListDrawable();
mNormalDrawable.addState(new int[]{R.attr.state_available}, createAvailableDrawable(attr));
但是这个方法不接受自定义状态。
您知道如何创建自定义按钮(以编程方式创建)并添加自定义状态吗?
编辑:
我创建了两个按钮(可用和不可用),我有两种方法可以做到这一点:
private LayerDrawable createAvailableDrawable(TypedArray attr) {
LayerDrawable drawableAvailable = (LayerDrawable) getDrawable(R.drawable.button_available).mutate();
// Some modifications with custom attributs
return drawableAvailable;
}
private LayerDrawable createUnavailableDrawable(TypedArray attr) {
LayerDrawable drawableUnavailable = (LayerDrawable) getDrawable(R.drawable.button_unavailable).mutate();
// Some modifications with custom attributes
return drawableUnavailable;
}
在我有一个新的自定义属性之后:
<declare-styleable name="CustomButton">
<attr name="state_available" format="boolean" />
</declare-styleable>
然后我覆盖了 onCreateDrawableState 方法:
@Override
protected int[] onCreateDrawableState(int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
if (mIsAvailable) {
mergeDrawableStates(drawableState, STATE_AVAILABLE);
}
return drawableState;
}
然后我试了一下:
StateListDrawable mNormalDrawable;
mNormalDrawable = new StateListDrawable();
mNormalDrawable.addState(new int[]{R.attr.state_available}, createAvailableDrawable(attr));
mNormalDrawable.addState(new int[]{-R.attr.state_available}, createUnavailableDrawable(attr));
现在我添加按钮:
<mobile.custom.com.library.Widget.CustomButton
android:id="@+id/CustomButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
custom:vd_cornerRadius="5dp"
custom:vd_color_text_unavailable="@color/yellow"
custom:vd_text_available="@string/available"
custom:vd_text_unavailable="@string/unavailable"
custom:state_available="false" />
现在当我改变 custom:state_available 的值时,按钮不会改变
最佳答案
在您的 CustomButton
中,类覆盖 onCreateDrawableState
,以合并您的自定义状态:
private static final int[] STATE_AVAILABLE = { R.attr.state_available };
@Override
public int[] onCreateDrawableState(int extraSpace) {
final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
if (available) {
mergeDrawableStates(drawableState, STATE_AVAILABLE);
}
return drawableState;
}
mergeDrawableStates
会将您的自定义状态 STATE_AVAILABLE
合并到基本状态中
关于android - 具有自定义状态的自定义按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29676567/