ボタンをプログラムで作成する際に問題が発生しました。このボタンは、既存のレイアウトに挿入されるはずです。ボタンインスタンスがAnimatorSet.cloneでNullPointerExceptionをスローする
特定のコンテナのディメンションが必要なので、そのコンテナのグローバルレイアウトリスナーを作成し、onGlobalLayoutコールバックで有効なサイズを確認して新しいButtonをインスタンス化します。
使用されるコンテキストは、コンテナのコンテキストです。
final View container = activity.findViewById(...);
container.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
public void onGlobalLayout() {
if (container.getWidth()>0 && container.getHeight()>0) {
Button button = new Button(container.getContext());
}
}
});
しかし、まれに - 特異別のアクティビティからの切り替え - ボタンインスタンス化は、AndroidフレームワークコードにNullPointerExceptionで失敗します。
java.lang.NullPointerException: Attempt to read from field 'android.animation.Animator android.animation.AnimatorSet$Node.mAnimation' on a null object reference
at android.animation.AnimatorSet.clone(AnimatorSet.java:725)
at android.animation.AnimatorSet.clone(AnimatorSet.java:682)
at android.animation.StateListAnimator.clone(StateListAnimator.java:148)
at android.animation.StateListAnimator$StateListAnimatorConstantState.newInstance(StateListAnimator.java:328)
at android.animation.StateListAnimator$StateListAnimatorConstantState.newInstance(StateListAnimator.java:327)
at android.content.res.ConstantState.newInstance(ConstantState.java:53)
at android.content.res.ConstantState.newInstance(ConstantState.java:61)
at android.content.res.ConfigurationBoundResourceCache.getInstance(ConfigurationBoundResourceCache.java:40)
at android.animation.AnimatorInflater.loadStateListAnimator(AnimatorInflater.java:163)
at android.view.View.<init>(View.java:4815)
at android.widget.TextView.<init>(TextView.java:995)
at android.widget.Button.<init>(Button.java:113)
at android.widget.Button.<init>(Button.java:106)
at android.widget.Button.<init>(Button.java:102)
at android.widget.Button.<init>(Button.java:98)
私の仮定は、どういうわけか、私は活動が非アクティブ化されたときリスナーを削除しますか
..コンテキストがこれ以上有効ではありませんイストが、私はそれに私の指を置くことができないということです。
アイデア?ドキュメントとして
どのようにリスナーを削除しますか? – CoXier
[NullPointerExceptionとは何か、それを修正するにはどうすればいいですか?](https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) ) – KeLiuyue
@CoXier上記のコードは単純化したものです。実際には、コードを保持するクラスはOnGlobalLayoutListenerインタフェースを実装しています。インスタンスは後で再び削除されます(通常のsdkレベルのチェックとremoveGlobalOnLayoutListenerまたはremoveOnGlobalLayoutListenerを実行します)。 –