2017-11-22 15 views
0

私はこの質問(getWidth() and getHeight() of View returns 0)のサンプルコードを使用しています。Kotlin匿名クラスthis

それは次のコード、

view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       view.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
       view.getHeight(); //height is ready 
      } 
     }); 

を持っていたと私は結果がだから、

11-22 19:18:33.319 4754-4754/loser.qrcode D/Should be called once: Height = 672, Width = 672 
11-22 19:18:33.328 4754-4754/loser.qrcode D/Should be called once: Height = 672, Width = 672 

だった、それが二回呼ばれたこの

image_view.viewTreeObserver.addOnGlobalLayoutListener{ 
    image_view.viewTreeObserver.removeOnGlobalLayoutListener { this } 
    Log.d("Should be called once", "Height = " + image_view.height + ", Width = " + image_view.width) 
}; 

ようKotlinにそれを書きました。つまり、removeOnGlobalLayoutListenerは機能しませんでした。 thisの代わりに何を使用すればよいですか?

答えて

1

ここで問題となっているのは、Kotlinがasummingであることです。removeOnGlobalLayoutListenerにはSAM expressionが必要です。

view.getViewTreeObserver().removeOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     YourOuterClass.this; 
    } 
}); 

そして、このリスナーは、あなたが持っている、これを解決するために、現在のリスナーリスト

に存在しません:あなたは{ this }を渡しているときに、あなたはちょうどここに、同等の別のOnGlobalLayoutListenerインスタンスを作成しますあなたのOnGlobalLayoutListenerをオブジェクトとして宣言し、lambaとしてではなく、正しい "this"を参照し、一度呼び出されるとリスナーを適切に削除することができます。

image_view.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { 
    override fun onGlobalLayout() { 
     image_view.viewTreeObserver.removeOnGlobalLayoutListener(this) 
     Log.d("Should be called once", "Height = " + image_view.height + ", Width = " + image_view.width) 
    } 
}) 
関連する問題