android - 具有自定义状态的自定义按钮

标签 android

我创建了一个自定义按钮类(我遵循了这个主题: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/

相关文章:

android - 使用 XMLPullParser 解析 XML

android - 运行android模拟器时出现问题

java - 如何使按钮方形和可调整大小

java - 使用 Android 开发工具 v. 23 更新 Eclipse

Android:配置 .xml 必须同意根元素的 ID

android listview 每个项目的不同 View

android - 为什么我无法正确导入facebook SDK?

android - LinearLayout、RelativeLayout 等边距不按预期工作

android - Chrome 中 Bootstrap 4 底部的巨大空白

android - 单选按钮在可触摸设备上不起作用