关于Drawable设置到控件中不显示的问题

来源:互联网 发布:淘宝一元秒杀神器 编辑:程序博客网 时间:2024/05/16 17:19

今天写项目时遇到个很变态的问题,就是关于Drawable不显示.

1.在此之前,我们需要先知道Drawable这个类,如果你是在代码中设置进去的话,必须要设置setBound(),就像这样:

//ResourceUtil.getDra是我的一个工具类.根据版本获取Drawable的Drawable drawble = ResourceUtil.getDra(getContext(),R.drawable.ic_pay_select_checked);button.setBounds(0,0,drawble.getMinimumWidth(),drawble.getMinimumHeight());

2.现在的需求就是为RadioButton设置点击事件,xml创建就不用我说了,我们用代码创建–StateListDrawable(不了解的自行百度)

            StateListDrawable btnRightDra = new StateListDrawable();            //获取图片资源            Drawable checkDra = ResourceUtil.getDra(getContext(),R.drawable.ic_pay_select_checked);            //根据颜色生成纯色的Drawable            ColorDrawable colorDrawable =new                             ColorDrawable(ResourceUtil.getCol(getContext(),R.color.colorBGWhite));            //设置非check的Drawable            btnRightDra.addState(new int[]{-android.R.attr.state_checked},                    colorDrawable);            //设置check的Drawable            btnRightDra.addState(new int[]{android.R.attr.state_checked},checkDra                    );            btnRightDra.addState(new int[]{},colorDrawable);            btnRightDra.setBounds(0,0,btnRightDra.getMinimumWidth(),btnRightDra.getMinimumHeight());            acRBtn.setCompoundDrawables(null,null,btnRightDra,null);

好了,之后运行测试,发现drawable无法显示,之后不信邪,用xml文件写了个相同功能的并在xml中引用

创建drawable<?xml version="1.0" encoding="utf-8"?><resources>    <drawable name="tran">@color/R.color.colorBGWhite</drawable>    </resources>

创建selector ic_pay_select.xml

引用drawable<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">    <item android:drawable="@color/tran" android:state_checked="false" />    <item android:drawable="@drawable/ic_pay_select_checked" android:state_checked="true" /></selector>
之后引用        <android.support.v7.widget.AppCompatRadioButton            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_margin="@dimen/general_dimen_x1"            android:background="@color/colorBGWhite"            android:button="@null"            android:drawableRight="@drawable/ic_pay_select"            android:drawablePadding="@dimen/general_dimen_x2"            android:padding="@dimen/general_dimen_x2"            android:text="支付宝" />

嗯,没错,没用!根本就不出现!

3.解决办法

之后通过调试发现,StateListDrawable的getMinimumWidth()和getMinimumHeight()返回的都是0,这是因为我们设置的非check(就是平常状态)的Drawable是ColorDrawable,而ColorDrawable因为是我们生成的是没有最小高度和最小宽度的!而StateListDrawable是会获取平常状态下显示的Drawable的最小宽高最为自己的最小宽高的,所以我们只要把StateListDrawable设置最小宽高设置为btnRightDra或者自己设置个值就行了,想通这点后我们连ColorDrawable都不需要了,因为这是我以为StateListDrawable不出来是因为Drawble不能为null的原因,更改后的代码

            AppCompatRadioButton acRBtn = (AppCompatRadioButton) rgPayway.getChildAt(i);            StateListDrawable btnRightDra = new StateListDrawable();            Drawable checkDra = ResourceUtil.getDra(getContext(),R.drawable.ic_pay_select_checked);            btnRightDra.addState(new int[]{-android.R.attr.state_checked},                    null);            btnRightDra.addState(new int[]{android.R.attr.state_checked},checkDra                    );            //重点就在这里            btnRightDra.setBounds(0,0,checkDra.getMinimumWidth(),checkDra.getMinimumHeight());            acRBtn.setCompoundDrawables(null,null,btnRightDra,null);

问题解决!!

0 0
原创粉丝点击