您的位置:首页 > 其它

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

2016-12-07 17:29 543 查看
今天写项目时遇到个很变态的问题,就是关于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);


问题解决!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Drawable显示 控件