未被调用的构造函数

时间:2015-12-01 07:49:50

标签: android

我正在创建一个自定义View,需要在构造函数中设置一些标志。标志不会在其他任何位置设置,并在onSaveInstanceStateonRestoreInstanceState方法中保存/恢复。

问题是当我尝试使用它时,并不总是设置标志。我记录了每个实例使用的构造函数,但似乎有些情况下没有使用它们。我想不出任何其他可能被调用的构造函数。

public class TextViewCompat extends AppCompatTextView
{
    private int constructor = 0;
    private boolean isPreHoneycomb;
    private boolean isPreJellybean;

    public TextViewCompat(Context context)
    {
        this(context, null);
        constructor = 1;
    }

    public TextViewCompat(Context context, AttributeSet attrs)
    {
        this(context, attrs, 0);
        constructor = 2;
    }

    public TextViewCompat(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);

        isPreHoneycomb = Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB;
        isPreJellybean = Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1;

        constructor = 3;
    }

    @Override
    public Parcelable onSaveInstanceState()
    {
        Log.d("Kevin", "onSaveInstanceState");
        Bundle bundle = new Bundle();
        bundle.putParcelable("instanceState", super.onSaveInstanceState());
        bundle.putBoolean("isPreHoneycomb", isPreHoneycomb);
        bundle.putBoolean("isPreJellybean", isPreJellybean);

        return bundle;
    }

    @Override
    public void onRestoreInstanceState(Parcelable state)
    {
        Log.d("Kevin", "onRestoreInstanceState");
        if (state instanceof Bundle)
        {
            Bundle bundle = (Bundle) state;
            isPreHoneycomb = bundle.getBoolean("isPreHoneycomb", Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB);
            isPreJellybean = bundle.getBoolean("isPreJellybean", Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1);

            state = bundle.getParcelable("instanceState");
        }
        super.onRestoreInstanceState(state);
    }

    @Override
    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter)
    {    
        Log.d("Kevin", "=================");
        Log.d("Kevin", "constructor=" + constructor);
        Log.d("Kevin", "isPreJellybean=" + isPreJellybean);
        Log.d("Kevin", "isPreHoneycomb=" + isPreHoneycomb);
        Log.d("Kevin", "=================");

        super.onTextChanged(text, start, lengthBefore, lengthAfter);
    }
}

我知道在这种情况下我可以很容易地解决这个问题,因为可以随时重新计算标志。但关键是构造函数没有被调用,并且对于我想保留的任何其他标志都是一个问题。

注意:视图是从xml而不是以编程方式膨胀,并在API 10仿真器和设备上进行测试(两个标志都应该为true)。

2 个答案:

答案 0 :(得分:0)

您可以尝试此操作。通过super代替this

public TextViewCompat(Context context)
{
    super(context);
    constructor = 1;
}

public TextViewCompat(Context context, AttributeSet attrs)
{
    super(context, attrs);
    constructor = 2;
}

答案 1 :(得分:0)

我发现了这个问题。我正在onTextChanged方法中打印出标志。由于我从布局(在attrs中设置的文本)中膨胀视图,因此构造函数在行super(context, attrs, defStyle);上设置文本并在设置标志之前触发onTextChanged

愚蠢的错误,但感谢任何使我朝正确方向推动的评论。