2017-09-11 13 views
0

何度も尋ねられたAndroidビューの質問があります。しかし、私は必要な答えを決して得ることはできません。 サイズ(高さ)を一定の割合で変更するビューを作成する必要があります。ことは、私はそうするためにはAndroidビューオリジナルの「コンテンツをラップする」私のビューのサイズ

setHeight(percentage){ 
    view.setHeight(Originl * percentage) 
} 

ような何かをしたい、私は何も変更せずにビューまたは外側のレイアウト(そうなしMatch_Parent)の元の高さを必要としています。 ビューの高さを計算するにはさまざまな方法がありますが、現在の高さは結果として「希望の」高さにはなりません。

たとえば、私はonMeasure()を使用しようとしました。これは、ビューが測定された瞬間ですが、ビューの高さを変更するときに呼び出されるためです。また、ビュー "創造"で何度か行われます。最初の測定値が間違ったデータ(たとえば、2番目のonMeasureが実際の値を返すまでの高さなど)を与えて2回呼び出されることがあるため、最初の値を取ることさえできません。

私は今もすばらしいわけではありませんが、うまくいくようなことをしました。これは、多かれ少なかれ動作するようですが、それが本当に行う方法である私はその

getViewTreeObserver().addOnGlobalLayoutListener(this) 

のようにリスナーを追加し、コールバックメソッドでは、私は

override fun onGlobalLayout() { 
     Log.d("OnGlobalLayout", "Height: $height") 
     originalHeight = height 
     getViewTreeObserver().removeOnGlobalLayoutListener(this) 
} 

をリスナーを削除しますか?私は現在のものが何であっても、予想されるビューのサイズを取得するいくつかのメソッドを期待していました。

どうすればいいですか?

答えて

1

あなただけ

mView.afterMeasured { 
     // inside this block the view is completely drawn, 
     // here you have an access for its height and width 
    } 
+0

まあを書きたよりその

inline fun View.afterMeasured(crossinline f: View.() -> Unit) { viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { override fun onGlobalLayout() { if (measuredHeight > 0 && measuredWidth > 0) { viewTreeObserver.removeOnGlobalLayoutListener(this) f() } } }) } 

のような景色のために一度拡張機能を記述することができ、少なくともクリーナーソリューションのthats。しかしこれは本当にこれを行う最善の方法ですか? –

関連する問題