首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >onCreateDrawableState中的setBackground

onCreateDrawableState中的setBackground
EN

Stack Overflow用户
提问于 2014-07-29 14:52:03
回答 2查看 2.5K关注 0票数 0

我有一种情况,我需要在onCreateDrawableState中动态地根据条件对我的自定义按钮进行setBackground。所以我的代码是这样的

代码语言:javascript
复制
public class MyButton extends Button  {
public boolean nightMode = false;
private Drawable dayBackground, nightBackgound;
public MyButton(Context context, AttributeSet attrs) {
    super(context, attrs);
    setDuplicateParentStateEnabled(true);
    TypedArray a = context.getTheme().obtainStyledAttributes(
            attrs,
            R.styleable.QITheme,
            0, 0);

    try {
        dayBackground = a.getDrawable(R.styleable.MyTheme_dayBackground);
        nightBackgound = a.getDrawable(R.styleable.MyTheme_nightBackground);
    } finally {
        a.recycle();
    }

}
@Override
protected int[] onCreateDrawableState(int extraSpace) {
    int[] state = super.onCreateDrawableState(extraSpace+1);
    if (CurrentThemeManager.isNightMode()) {
        if(nightBackgound != null)
            setBackground(nightBackgound);
    } else {
        if(dayBackground != null)
            setBackground(dayBackground);
    }
    return state;
}

}

但是由于setBackground间接调用onCreateDrawableState,因此由于无限的递归调用,我得到了StackOverflowError

代码语言:javascript
复制
java.lang.StackOverflowError
        at android.view.ViewGroup.onCreateDrawableState(ViewGroup.java:5370)
        at android.view.View.onCreateDrawableState(View.java:14635)
        at android.view.ViewGroup.onCreateDrawableState(ViewGroup.java:5370)
        at my.mytheme.widget.MyButton.onCreateDrawableState(MyButton.java:69)
        at android.view.View.getDrawableState(View.java:14611)
        at android.view.View.setBackgroundDrawable(View.java:14837)
        at android.view.View.setBackground(View.java:14777)
        at my.mytheme.widget.MyButton.onCreateDrawableState(MyButton.java:76)
        at android.view.View.getDrawableState(View.java:14611)
        at android.view.View.setBackgroundDrawable(View.java:14837)
        at android.view.View.setBackground(View.java:14777)
        at my.mytheme.widget.MyButton.onCreateDrawableState(MyButton.java:76)
        at android.view.View.getDrawableState(View.java:14611)
        at android.view.View.setBackgroundDrawable(View.java:14837)
        at android.view.View.setBackground(View.java:14777)
        at my.mytheme.widget.MyButton.onCreateDrawableState(MyButton.java:76)
        at android.view.View.getDrawableState(View.java:14611)
        at android.view.View.setBackgroundDrawable(View.java:14837)
        at android.view.View.setBackground(View.java:14777)
        at my.mytheme.widget.MyButton.onCreateDrawableState(MyButton.java:76)
        at android.view.View.getDrawableState(View.java:14611)
        at android.view.View.setBackgroundDrawable(View.java:14837)
        at android.view.View.setBackground(View.java:14777)
        at my.mytheme.widget.MyButton.onCreateDrawableState(MyButton.java:76)
        at android.view.View.getDrawableState(View.java:14611)
        at android.view.View.setBackgroundDrawable(View.java:14837)
        at android.view.View.setBackground(View.java:14777)
        at my.mytheme.widget.MyButton.onCreateDrawableState(MyButton.java:76)
        at android.view.View.getDrawableState(View.java:14611)
        at android.view.View.setBackgroundDrawable(View.java:14837)
        at android.view.View.setBackground(View.java:14777)
        at my.mytheme.widget.MyButton.onCreateDrawableState(MyButton.java:76)
        at android.view.View.getDrawableState(View.java:14611)
        at android.view.View.setBackgroundDrawable(View.java:14837)
        at android.view.View.setBackground(View.java:14777)
        at my.mytheme.widget.MyButton.onCreateDrawableState(MyButton.java:76)
        at android.view.View.getDrawableState(View.java:14611)
        at android.view.View.setBackgroundDrawable(View.java:14837)
        at android.view.View.setBackground(View.java:14777)
        at my.mytheme.widget.MyButton.onCreateDrawableState(MyButton.java:76)
        at android.view.View.getDrawableState(View.java:14611)
        at android.view.View.setBackgroundDrawable(View.java:14837)
        at android.view.View.setBackground(View.java:14777)
        at my.mytheme.widget.MyButton.onCreateDrawableState(MyButton.java:76)
        at android.view.View.getDrawableState(View.java:14611)
        at android.view.View.setBackgroundDrawable(View.java:14837)
        at android.view.View.setBackground(View.java:14777)
        at my.mytheme.widget.MyButton.onCreateDrawableState(MyButton.java:76

有人能帮我修一下这个StackOverflowError吗?

EN

回答 2

Stack Overflow用户

发布于 2015-02-23 07:10:21

您不应该从onCreateDrawableState调用setBackground。这是一种懒惰的方式。而是应该将状态从drawable更改。

像这样烹调:

在选择器中定义您的绘图对象(例如,使用state_checked)

代码语言:javascript
复制
<item android:state_checked="false"
    android:drawable="@drawable/night_image" />
<item android:state_checked="true"
    android:drawable="@drawable/day_image" />

  1. 在自定义视图中添加状态处理

类YourFancyView扩展SomeView实现Checkable { private static final int[] CHECKED_STATE_SET ={ android.R.attr.state_checked };@Override protected int[] onCreateDrawableState(int extraSpace) { final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);if (isChecked()) { mergeDrawableStates(drawableState,CHECKED_STATE_SET);} return drawableState;} @Override public void setChecked(选中布尔值){ if(mChecked != checked) { mChecked = checked;refreshDrawableState();}}

  • 下一步-编码任何合理的方法来设置checked状态。

新的v= YourFancyView YourFancyView();

if(itIsTime) v.setChecked(true);

这应该能起到作用。

票数 3
EN

Stack Overflow用户

发布于 2014-07-29 15:06:06

我不确定这是否真的能解决您遇到的问题,但我认为您应该用setBackgroundDrawable()替换setBackground()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25009669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档