【问题标题】:how to solve java.lang.StackOverflowError from BadgeView class如何从 BadgeView 类中解决 java.lang.StackOverflowError
【发布时间】:2015-11-26 09:56:47
【问题描述】:

我正在使用此 BadgeView 类在日历事件日期中创建徽章..第一次运行但当进入下个月 BadgeView 类时,它会给出 stackoverflow 错误.. 由 this 调用的badgeView 类和线性布局上的标记应用

badge = new BadgeView(context, event_dateview_layout);
                    badge.setText("" + eventno.size());
                    Log.d("aa", "eventno:" + eventno);
                    badge.show();


BadgeView.java

import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.RoundRectShape;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewParent;
import android.widget.FrameLayout;
import android.widget.TextView;

public class BadgeView extends TextView {

    private Context context;
    private View target;
    private ShapeDrawable badgeBg;

    public BadgeView(Context context, View target) {

        this(context, null, android.R.attr.textViewStyle, target);
    }

    public BadgeView(Context context, AttributeSet attrs, int defStyle, View target) {

        super(context, attrs, defStyle);
        init(context, target);
    }

    private void init(Context context, View target) {

        this.context = context;
        this.target = target;

        //apply defaults
        setTypeface(Typeface.DEFAULT_BOLD);
        setPadding(7, 0, 7, 0);
        setTextColor(Color.WHITE);

        if (this.target != null) {
            applyTo(this.target);
        } else {
            show();
        }

    }

    private void applyTo(View target) {

        LayoutParams lp = target.getLayoutParams();
        ViewParent parent = target.getParent();
        FrameLayout container = new FrameLayout(context);

        // TODO verify that parent is indeed a ViewGroup
        ViewGroup group = (ViewGroup) parent;
        int index = group.indexOfChild(target);

        group.removeView(target);
        group.addView(container, index, lp);
        container.addView(target);
        container.addView(this);
        group.invalidate();

    }

    public void show() {

        if (getBackground() == null) {
            if (badgeBg == null) {
                badgeBg = getDefaultBackground();
            }
            setBackgroundDrawable(badgeBg);
        }
        applyLayoutParams();
    }

    private ShapeDrawable getDefaultBackground() {

        float[] outerR = new float[]{20, 20, 20, 20, 20, 20, 20, 20};
        RoundRectShape rr = new RoundRectShape(outerR, null, null);
        ShapeDrawable drawable = new ShapeDrawable(rr);
        drawable.getPaint().setColor(Color.RED);
        return drawable;
    }

    private void applyLayoutParams() {

        FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        lp.gravity = Gravity.RIGHT | Gravity.TOP;
        setLayoutParams(lp);
    }

 java.lang.StackOverflowError
            at android.view.HardwareCanvas.<init>(HardwareCanvas.java:29)
            at android.view.GLES20Canvas.<init>(GLES20Canvas.java:100)
            at android.view.GLES20RecordingCanvas.<init>(GLES20RecordingCanvas.java:62)
            at android.view.GLES20RecordingCanvas.<init>(GLES20RecordingCanvas.java:38)
            at android.view.GLES20RecordingCanvas$1.newInstance(GLES20RecordingCanvas.java:46)
            at android.view.GLES20RecordingCanvas$1.newInstance(GLES20RecordingCanvas.java:44)
            at android.util.FinitePool.acquire(FinitePool.java:69)
            at android.util.SynchronizedPool.acquire(SynchronizedPool.java:39)
            at android.view.GLES20RecordingCanvas.obtain(GLES20RecordingCanvas.java:66)
            at android.view.GLES20DisplayList.start(GLES20DisplayList.java:67)
            at android.view.View.getDisplayList(View.java:12682)
            at android.view.View.getDisplayList(View.java:12768)
            at android.view.View.draw(View.java:13502)
            at android.view.ViewGroup.drawChild(ViewGroup.java:2928)
            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797)
            at android.view.View.getDisplayList(View.java:12722)
            at android.view.View.getDisplayList(View.java:12768)
            at android.view.View.draw(View.java:13502)
            at android.view.ViewGroup.drawChild(ViewGroup.java:2928)
            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797)
            at android.view.View.getDisplayList(View.java:12722)
            at android.view.View.getDisplayList(View.java:12768)
            at android.view.View.draw(View.java:13502)
            at android.view.ViewGroup.drawChild(ViewGroup.java:2928)
            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797)
            at android.view.View.getDisplayList(View.java:12722)
            at android.view.View.getDisplayList(View.java:12768)
            at android.view.View.draw(View.java:13502)
            at android.view.ViewGroup.drawChild(ViewGroup.java:2928)
            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797)
            at android.view.View.getDisplayList(View.java:12722)
            at android.view.View.getDisplayList(View.java:12768)
            at android.view.View.draw(View.java:13502)
            at android.view.ViewGroup.drawChild(ViewGroup.java:2928)
            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797)
            at android.view.View.getDisplayList(View.java:12722)
            at android.view.View.getDisplayList(View.java:12768)
            at android.view.View.draw(View.java:13502)
            at android.view.ViewGroup.drawChild(ViewGroup.java:2928)
            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797)
            at android.view.View.getDisplayList(View.java:12722)
            at android.view.View.getDisplayList(View.java:12768)
            at android.view.View.draw(View.java:13502)
            at android.view.ViewGroup.drawChild(ViewGroup.java:2928)
            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797)
            at android.view.View.getDisplayList(View.java:12722)
            at android.view.View.getDisplayList(View.java:12768)
            at android.view.View.draw(View.java:13502)
            at android.view.ViewGroup.drawChild(ViewGroup.java:2928)
            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797)
            at android.view.View.getDisplayList(View.java:12722)
            at android.view.View.getDisplayList(View.java:12768)
            at android.view.View.draw(View.java:13502)
            at android.view.ViewGroup.drawChild(ViewGroup.java:2928)
            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797)
            at android.view.View.getDisplayList(View.java:12722)
            at android.view.View.getDisplayList(View.java:12768)
            at android.view.View.draw(View.java:13502)
            at android.view.ViewGroup.drawChild(ViewGroup.java:2928)
            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797)
            at android.view.View.getDisplayList(View.java:12722)
            at android.view.View.getDisplayList(View.java:12768)
            at android.view.View.draw(View.java:13502)
            at android.view.ViewGroup.drawChild(ViewGroup.java:2928)
            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797)
            at android.view.View.getDisplayList(View.java:12722)
            at android.view.View.getDisplayList(View.java:12768)
            at android.view.View.draw(View.java:13502)
            at android.view.ViewGroup.drawChild(ViewGroup.java:2928)
            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2797)
            at android.view.View.getDisplayList(View.

【问题讨论】:

标签: android badge


【解决方案1】:

我尝试了您的代码,但没有出现任何错误。

【讨论】:

  • @ron 那么在您添加该布局的布局中存在一些问题。
  • 将该布局添加到另一个布局中,然后将该 xml 用作视图 v
  • 它工作正常,在任何视图中都没有任何错误,我尝试将 targetView 作为线性布局和 textview,它工作正常。
  • 请尝试将 targetView 作为线性布局并仅查看
  • 在我的布局中,我已经采取了布局,里面还有另一个视图,这里我将视图作为 targetView 传递。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
相关资源
最近更新 更多