2017-11-08 6 views
0

ボタンをプログラムで作成する際に問題が発生しました。このボタンは、既存のレイアウトに挿入されるはずです。ボタンインスタンスが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) 

私の仮定は、どういうわけか、私は活動が非アクティブ化されたときリスナーを削除しますか

..コンテキストがこれ以上有効ではありませんイストが、私はそれに私の指を置くことができないということです。

アイデア?ドキュメントとして

+0

どのようにリスナーを削除しますか? – CoXier

+0

[NullPointerExceptionとは何か、それを修正するにはどうすればいいですか?](https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) ) – KeLiuyue

+0

@CoXier上記のコードは単純化したものです。実際には、コードを保持するクラスはOnGlobalLayoutListenerインタフェースを実装しています。インスタンスは後で再び削除されます(通常のsdkレベルのチェックとremoveGlobalOnLayoutListenerまたはremoveOnGlobalLayoutListenerを実行します)。 –

答えて

0

グローバルレイアウト状態またはビューツリーの変更内のビューの視認性呼び出されるコールバックのOnGlobalLayoutListener

インタフェース定義は言います。

UIが破棄されると、NPEの原因となる「死んでいる」Viewが発生しています。あなたはそれを防ぐためにonStop()のリスナーを登録解除しようとすることができます。または、あなたが完全に作成しただけで処理する必要がある場合

container.post(new Runnable() { 
     @Override 
     public void run() { 
      Button button = new Button(container.getContext()); 
     } 
    }); 
+0

投稿されたRunnableがUIスレッドで呼び出され、コンテナが実際に作成されたときにレイアウトが完了しているとは限りません。私は通常getWidth()とgetHeight()が0を返すときにコールバックを取得します。 –

関連する問題