xiaoyan_12 2012-10-16 03:51 采纳率: 25%
浏览 6860
已采纳

Android:如何添加一个自定义的按钮状态

例如,默认按钮在它的状态和背景图片之间具有以下依赖:

<?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), 然后可以使用它动态地改变按钮的外观吗?

  • 写回答

1条回答 默认 最新

  • csh_34 2012-10-16 05:48
    关注
     <?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>
    
    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;}
    Then override function "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;
    }
    

    文件 "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>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 关于#python#的问题:自动化测试