我正在创建一个自定义View
,需要在构造函数中设置一些标志。标志不会在其他任何位置设置,并在onSaveInstanceState
和onRestoreInstanceState
方法中保存/恢复。
问题是当我尝试使用它时,并不总是设置标志。我记录了每个实例使用的构造函数,但似乎有些情况下没有使用它们。我想不出任何其他可能被调用的构造函数。
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)。
答案 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
。
愚蠢的错误,但感谢任何使我朝正确方向推动的评论。