2017-07-13 23 views
-2

私は自分のコードで合成プロパティを使用しました。しかし、どのようにいつ実際にアンドロイドの各ビューを初期化するのかと思っています。kotlin - 合成プロパティを初期化する方法は?

各ビューをインポートし、そのIDでアクセスするだけです。ビューオブジェクトにメモリを割り当てるとき?

+0

XMLから膨らませている場合は、実行中にメモリが割り当てられます。 – Sufian

答えて

3

これは、Kotlin Android拡張機能を使用する場所でKotlinファイルを逆コンパイルすることで調査するのは簡単です。 (Tools -> Kotlin -> Show Kotlin Bytecodeに行ってから、表示されている枠でDecompileを選択してください)。つまり、それは魔法ではなく、findViewByIdを使用して、Viewを具体的なタイプにキャストします。

ActivityまたはFragmentの内部で使用する場合は、参照は1回だけ発生するようにMapにキャッシュされます。その後、キーとしてIDを使ってマップエントリを取得するだけのコストを支払うだけです。

またこれらの例では、何のキャッシングはありません、それに与えられたIDを持つ子供を見つけるために、 ViewGroupにそれを使用することができ

は、これらの呼び出しは、その行があるたびに起こるのだろう簡単なfindViewByIdの呼び出しに置き換えられます到達した。

val view = inflater.inflate(...) 
view.btnLogin.text = "Login" 

そして、それはバイトコードでこれに似たものに変換されます:あなたのレイアウトの実際のViewインスタンスがまだ作成されていることを

View view = inflater.inflate(...); 
Button btnLogin = (Button) view.findViewById(R.id.btnLogin); 
btnLogin.setText("Login"); 

メモこの2番目の構文は次のようになります膨張される。 Kotlin Android拡張機能は、findViewByIdコール以上の構文砂糖のみです。

+1

貴重なご回答ありがとうございます。しかし、_ $ _ clearFindViewByIdCacheメソッドが呼び出されたら? – paril

+1

'Activity'では、これは呼び出す必要はなく、' Fragment'では 'onDestroyView'メソッドの中で呼び出されます。 – zsmb13